Introduction

This report is an overview of the initial observations and analysis performed on the Food Security Cluster 5Ws data for 2021; the issues identified and analysis have been broken into large groups corresponding with the first 4 chapters – geographical coverage, activities and modalities, partners and beneficiaries. This report ends with a brief section on next steps and an interactive reference table and interactive reference maps.

We have endeavoured to provide actionable information and believe that releasing this report is a necessary part of jump-starting the process of resolving the more pressing concerns identified. Further analysis is merited in several areas; and this will be undertaken once consultations with partners have been completed.

Unless otherwise specified, beneficiary figures in this report are unique beneficiaries, as opposed to beneficiary frequencies.




1. Geographical coverage

1.1 Comparing beneficiaries reached and 2021 PIN by state and region

A total of 3,260,968 unique beneficiaries have been reached across the country; this is 117.79% of the targetted 2,768,349 persons; however, not all the beneficiaries reached corresponded to areas where there were targets – this is explored in more detail in the section on townships.




1.2 Table of beneficiaries and PIN by state and region

Beneficiaries reached (desc.) and PIN by state/region
state beneficiaries %_of_ben target %_of_target %_target_reached PIN
Yangon 2,011,575 61.83 1,777,522 64.21 113.17 1,777,522
Rakhine 530,202 16.30 487,182 17.60 108.83 632,805
Mandalay 143,526 4.41 381,818 13.79 37.59 381,818
Ayeyarwady 99,481 3.06 0 0.00 0
Magway 96,767 2.97 0 0.00 0
Kachin 89,818 2.76 86,117 3.11 104.30 102,649
Kayin 68,108 2.09 6,855 0.25 993.55 6,855
Shan (North) 66,220 2.04 13,428 0.49 493.15 24,657
Mon 48,181 1.48 0 0.00 0
Sagaing 31,985 0.98 0 0.00 0
Kayah 17,746 0.55 5,830 0.21 304.39 5,830
Chin 17,005 0.52 5,106 0.18 333.04 13,275
Shan (South) 15,511 0.48 1,978 0.07 784.18 2,054
Bago (East) 12,974 0.40 2,513 0.09 516.28 2,513
Tanintharyi 4,476 0.14 0 0.00 0


Yangon and Rakhine form both 82% of the target and 78% of the beneficiaries reached. Mandalay has has the largest difference between targets and beneficiaries reached. There were five states (Ayeyarwady, Mon, Sagaing, Magway and Tanintharyi) where beneficiaries were reached but were not included as part of the 2021 target or PIN; however, the beneficiaries reached in these areas represent less than 5% of all beneficiaries reached. Additionally, targets have been exceeded in all states except Mandalay, with Kayin having reached 994% of its target of 6,855 persons.

However, moving forward, the PIN for 2022 is much more evenly spread across the country: with reference to the plot below, Yangon, along with Magway and Mandalay have some of the lowest proportions of vulnerable persons in relation to the total state population, meaning that careful beneficiary selection and tight vulnerability in these areas will necessary to avoid excessive inclusion errors.




1.3 Township-level distribution of beneficiaries

Just as the response is heavily weighted towards Yangon and Rakhine at the state and region level, the same is also true at the township level. These 10 townships below are where 76% of all FSC beneficiaries have been reached, they represent 60% of the 2021 target. In particular, Hlaingtharya has beneficiary figures that are 378% of its target. Additionally, neither Nyaung-U nor Myingyan were targetted as part of the 2021 PIN despite being in the top 10 townships by beneficiaries reached – 82.68% of beneficiaries reached corresponded to townships with targets.

Top 10 townships by beneficiaries reached (desc) in 2021
township state beneficiaries %_of_ben target %_of_target %reached
Hlaingtharya Yangon 772,658 23.69 204,542 9.32 377.75
Shwepyithar Yangon 380,550 11.67 208,922 9.52 182.15
Dagon Myothit (Seikkan) Yangon 276,430 8.48 199,242 9.08 138.74
Dala Yangon 271,760 8.33 200,589 9.14 135.48
North Okkalapa Yangon 255,380 7.83 190,909 8.70 133.77
Sittwe Rakhine 149,885 4.60 127,750 5.82 117.33
Buthidaung Rakhine 147,985 4.54 121,631 5.54 121.67
Maungdaw Rakhine 121,432 3.72 71,360 3.25 170.17
Nyaung-U Mandalay 71,547 2.19 0 0.00
Myingyan Mandalay 46,608 1.43 0 0.00


152 townships have been reached by food security activities in the first three-quarters of 2021. This is 42.7% the 330 townships in the country. It is also important to note that two townships – Hpapun in Kayin and Kyethi in Shan (South) have been targetted since the initial 2021 HRP, yet have not been reached by any FSC activities; 5 townships, overall, in either the HRP or IERP, have not benefitted from any FSC activities.

Overall, 97.4% of the targetted population was reached. From the histogram below, we can see that overreach and under-reaching were very common – townships are commonly clustered at around 0% reached and also at 200% reached or more. Of the 50 townships reached in 2021; 28 townships reached more than 120% of their target, 3 reached between 100% and 119% of their target; 4 townships reached between 80% and 100% of their target; and 15 townships reached less than 80% of their target.




1.4 Locations

Partners have responded in a total of 2500 locations across the country, with the vast majority of locations only having only one partner operating in them; the maximum number of partners in any location is 4. Of the 16041 rows reported in the 5Ws, only 211 did not report a specific location.

Locations are classified into three groups – camps, industrial zones and villages/towns/wards:

Summary of location types
location_type locations townships beneficiaries pc_of_ben avg_ben_per_loc
village_ward_town 2,088 125 2,546,522 88.45 1,220
camp 435 42 324,606 11.27 746
industrial_zone 5 2 7,870 0.27 1,574


The vast majority of locations are served by only one partner. Below are a series of histograms showing the variation in the number of beneficiaries by location, split by number of partners in each location. Locations with one partner present have a large peak around 100 beneficiaries per locations; and a slight majority of locations with two partners have more than 1,000 beneficiaries.


The more partners operating in a given location, the higher the average number of beneficiaries; however, it should be noted that these multi-partner locations are comparatively rare. The location with four partners is Nam Hlaing in Bhamo, Kachin.

Average beneficiaries by locations with one, two, three and four partners
number_of_partners locations avg_beneficiaries
one 2,396 142
two 110 930
three 12 2,258
four 1 49




2. Activities and modalities

2.1 Monthly progress by activity

Partners reported their achievements across the eight 5W activities. We see that the majority of the caseload for monthly cash-based transfers was established prior to 2021 (with the number of beneficiaries only increasing very incrementally across the course of the year) – this aligns with our understanding that many of the projects contributing to this activity were multi-year in nature and had been ongoing prior to the HRP; this pattern is also apparent in the provision of technical training.

One of the difficulties of interpreting these data is that it is not always apparent where the patterns observed are reflective or changes in the field (such as changes in access, funding or staffing) or if they are instead due to partners’ reporting behaviours. We note, for instance, a large jump in the number of beneficiaries for fishery kits and food baskets around July 2021 – this was due to the newly-approved addendum to the HRP. However, some of the other changes are less clear and will require careful exploration with partners.


2.2 Delivery modalilties

Cash and in-kind distributions were each the main delivery modality in three activities, with the provision of services and support being predominant in two. The in-kind modality has the highest reach, given the especially large beneficiary numbers originating from the provision of monthly food baskets. We also note several misclassifications – small portions of monthly cash transfers have been coded as “in-kind” and there are in-kind food baskets coded as “cash” and “hybrid”. It might also be worth more clearly delineating between “support for income-generating activities” and the “provision of technical training” as service delivery and support are heavily present in both.



61% of beneficiary frequencies received support through the in-kind delivery modality; we use beneficiary frequencies here as there were several instances of modalities changing partway through an intervention: for reference, 83% of beneficiaries were reached initially with in-kind interventions, meaning that there was a tendency to diversify away from in-kind support over 2021. 25% of beneficiary frequencies were reached by cash transfers.


Beneficiary frequencies by delivery modalities and frequency of distribution
delivery_modality First Monthly One-off Other NA Total %Total
In-kind 303,595 1,850,712 509,892 2,773,854 111,839 5,549,892 61.36
Cash 894 1,923,133 176,464 40,274 117,525 2,258,290 24.97
Service delivery/support 773,212 128,852 4,901 767 907,732 10.04
Hybrid (In-kind & Cash) 295,312 2,938 10,810 309,060 3.42
Voucher 2,652 16,519 19,171 0.21
Total 304,489 4,842,369 820,798 2,846,358 230,131 9,044,145 100.00


Regarding the table above, there is a strong argument to remove the option “other” from the 5W column frequency (referring to frequency of transfer/delivery) – what exactly it connotes is unclear, as partners might elect this option for activities that occur both more and less frequently than every month; there is also the possibility that partners are just electing “other” instead of leaving the column blank. It is possible to backfill some of the “other” values from the beneficiary_recurrency column. This will be explored further in the chapter on beneficiaries.

There is also justification to drop the “First” category as it does not really have much relation to the “Monthly” category, i.e. an increase in beneficiaries reported as “First” do not correspond to an increase in “Monthly” beneficiaries in the following months, meaning that these beneficiaries should fall under the “One-off” category.

A key piece of missing information not currently captured by the 5W template is the duration of these activities – the number of months a monthly food basket is provided can only be calculated somewhat reliably with considerable effort. The table below shows the average duration (in months) of the various activities in the frequency category “Monthly”:

Average duration (in months) of monthly activities
activity avg_duration_months
Provide monthly cash-based transfers 7.38
Provide crops & vegetables kits 6.00
Provide support for income generation 5.99
Provide technical training 4.75
Provide monthly food baskets 4.24
Cash for Work / Food for Assets 2.13



2.3 Monetary values of intervention packages per household



The most common transfer values – in terms of beneficiaries reached – are between USD 10 and USD 20, though it should be noted that a not insignificant number of households (about 7%) were reached by cash transfer interventions valued at USD 100 per household or more. Please note that these monetary values were calculated only from rows with unique beneficiaries and that we are not using the cumulative sums per household.


Cash transfer, hybrid and voucher values per household by cash delivery mechanism (USD)
cash_delivery_mechanism <$10 >=$10_<$20 >=$20_<$40 >=$40_<$60 >=$60_<$100 >=$100_<$200 >=$200 total_hhd pc_of_hhd
Direct cash payment 6,901 21,224 5,967 8,792 4,759 2,655 230 50,528 84.03
E-voucher 2,519 929 3,448 5.73
E-transfer 798 1,161 435 2,394 3.98
Mobile money 1,830 1,830 3.04
Money Transfer Agent 517 90 841 1,448 2.41
Other 8 403 21 432 0.72
Paper voucher 48 48 0.08


by far the most common cash delivery mechanism was direct cash payments – 84.03% of beneficiaries were reached through this mechanism. Transfers made through Money transfer agents had the highest average transfer amount.

Next, let us take a look at household package values by activity type:

Average value (USD) of household package values per activity
activity households total_value_usd avg_transfer_value
Provide livestock kits 1,030 103,950 100.92
Provide monthly cash-based transfers 43,204 2,076,185 48.06
Provide support for income generation 11,584 420,000 36.26
Cash for Work / Food for Assets 22,298 785,768 35.24
Provide crops & vegetables kits 33,187 240,694 7.25
Provide technical training 45,296 221,821 4.90
Provide fishery kits 1,601 4,032 2.52
Provide monthly food baskets 672,804 291,859 0.43


Overall, the highest average cash transfers were from the provision of livestock kits and the lowest averages from fishery kits (after discounting food baskets, where less than 1% of activities reported the package value). It is also unclear if fishery kits and technical training tended to have particularly small cash components or if there were data entry errors. But the average package values are only part of the picture and significant variation in transfer values exists within each activity:



It would be fruitful to explore the provision of monthly cash-based transfers in more detail – this activity has a very clear peak at >=$10_<$20. A closer look reveals that this is almost entirely due to the 22,543 beneficiaries who received monthly transfers of USD 10.50/month (or MMK 15,000) per household. It is unclear whether this is a data entry error – but what we do know is that the households that received this type of transfer were not smaller than average; it might also be possible that this activity had been conceived as one singular transfer that had been split across several months.

This should be followed up with the 7 partners who provided this transfer value to beneficiary households; they are: WFP, Plan International, Save the Children, Myanmar Heart Development Organisation, People for People, World Vision Myanmar and People in Need.

This amount falls far below the minimum expenditure basket for food identified by the Cash Working Group, which established a floor of MMK 190,555 per household per month. Below is a table which summarises the percentage of the minimum expenditure basket for food which is covered by the different bins we have established for the cash-transfer values:

Monthly cash-based transfer by percentage of MEB received
usd_hhd_bin avg_pc_of_meb avg_usd_month households pc_of_hhd
<$10 4.21 5.61 5,657 13.11
>=$10_<$20 7.92 10.57 22,424 51.98
>=$20_<$40 25.17 33.57 4,738 10.98
>=$40_<$60 34.06 45.43 5,759 13.35
>=$60_<$100 53.66 71.58 3,629 8.41
>=$100_<$200 79.86 106.53 931 2.16
>=$200 199.16 265.65 4 0.01


Around 10.5% of beneficiaries of monthly cash-based transfers have received more than 50% of the value of the minimum expenditure basket for food. Notably, 13% of beneficiary households have received less than USD 10 per household per month. This underscores the importance of standardisation: beneficiaries have already received very different package amounts and there is a pressing need to collect information on whether cash transfers (and food baskets) have been designed to be full rations, half rations or are instead intended to be supplementary activities. This is key from a coordination standpoint as we cannot consider the food security needs of those who have only received supplementary transfers to have been covered.




3. Partners

Of the implementing partners of the Food Security Cluster, a total of 62 of them classified themselves as implementing partners within the 5Ws. They are fairly evenly split themselves between HRP indicators, with 36 contributing towards food and cash assistance and 39 contributing towards agriculture and other livelihood support. 34 partners have reached less than 10,000 unique beneficiaries and the median unique beneficiaries reached by partners is 6,118. Below are the top 10 partners by HRP indicator. As a side note, Zigway should be considered as a vendor/supplier of WFP, and not the implementing partner – some follow up with WFP will be necessary to rectify this.

Top 10 partners by beneficiaries reached, by HRP indicator
Partners HRP indicator1
  1. Number of people who received food and/or cash assistance
Partners HRP indicator2
  1. Number of people who received agriculture and other livelihood support
MRCS 640,223 CESVI Foundation 196,869
Open Data Myanmar (ODM) 400,933 Center for Social Integrity (CSI) 84,427
Zigway 223,478 Helen Keller International 57,287
Hlaingthayar Development Network 204,275 Action for Green Earth 29,425
Urban Strength (US) 201,732 Action Contre la Faim 23,128
World Vision Myanmar 180,741 People for People 18,273
WFP 110,235 World Vision Myanmar 18,040
Hlaingthayar Youth Network 96,145 Myanmar Heart Development Organization 11,170
Myanmar Heart Development Organization 70,664 Da-Nu National Affairs organization (DNAO) 9,266
Karuna Mission Social Solidarity 70,014 WFP 8,061


3.1 Distribution of partners by beneficiaries and geographic reach

Whilst there is quite a bit of variation in the number of beneficiaries reached, we can see that partners’ geographic footprints are – on the whole – quite limited. Only 8 partners have a presence in more than 10 townships, with only 13 being present in more than 5 townships. 78% of our partners (clustered along the bottom of the chart) are present in 5 or less townships. This distribution of partners is an impediment to a countrywide response and it is imperative to understand how best to incentivise partners to expand their footprints.



3.2 Maps of number of partners and 2022 people in need by state/region

Food Security Cluster partners are not well-positioned to meet the needs of the 2022 population in need. Partners are largely concentrated in Kachin, Rakhine and Yangon, with only one partner present in Shan (East) and two in Tanintharyi.

Overall, 58% of townships, containing 46% of the 2022 PIN, do not have any partners present. This lack of nationwide coverage will be one of the most important constraints that the FSC will face in meeting the 2022 needs of vulnerable, food insecure persons and IDPs – and resolving this will necessitate both increasing partner coverage and finding new partners for the cluster.


3.3 Monthly progress by partner


The plot above shows the top 20 partners by number of beneficiaries reached in 2021, with the red line indicating July 2021, when the HRP addendum was approved and published. We can see that many, on the whole, the HRP addendum had a very large effect on the number of beneficiaries reached – most partners enacted a significant ramp up and reached the majority of beneficiaries after it was published. Exceptions to this include organisations such as CESVI, Helen Keller International, Save the Children and Myanmar Heart Development Organisation, who established most of their caseload prior to July 2021.



3.4 Types of implementing partners

Average reach by implementing partner type
implementing_partner_type avg_beneficiaries avg_townships avg_states
INGO 153,373 7.55 2.60
NNGO 110,421 3.10 1.21
other 73,975 2.00 1.00
UN 1,522,754 54.00 12.00


INGOs, on average, reached more beneficiaries across more townships than NNGOs, perhaps due to the generally tighter focus of several community-based organisations. There is only one agency in the “UN” category – WFP; the “other” category refers to two private limited companies which also implemented food security activities.



3.5 Reporting organisations

There are 72 combinations between reporting organisations and implementing partners, 23 of which are instances where the reporting organisation and the implementing partner are the same organisation; once these are filtered out, all the remaining implementing partners correspond to just 11 reporting organisations:

Number of implementing partners by reporting organisation
reporting_organization implementing_partners
WFP 25
FAO 6
Finn Church Aid 4
Save the Children 4
Cordaid 2
Mercy Corps 2
Trocaire 2
AVSI 1
Danish Refugee Council 1
Helvetas 1
Oxfam 1


Regarding questions of membership, it would be safe to say that all partners who reported in the 5Ws – be they reporting organisations or implementing partners – in addition to strategic partners and partners who aid in analysis who are not represented in the 5Ws, are FSC partners. However, for this report, we have used implementing_partners for most of the analysis as, by their nature, reporting organisations do not have a field presence. As a side note, FAO has not classified itself as an implementing partner, having reported no activities that were directly implemented by them.



3.6 Donors

69% of the rows had the donor column filled; however, this only represents activities reaching 23% of all beneficiaries. Below is a table of the 10 donors (after organisations using their own resources) whose funding has reached the most beneficiaries and the number of townships their funding has been used in:

Top 10 donors by number of beneficairies reached with their funding
donor beneficiaries pc_of_ben townships
Organizational own funds 191,006 5.86 36
UNDP 118,113 3.62 2
humanitarian Assitance and resilience Programme 87,502 2.68 7
AICS 63,986 1.96 5
MHF 61,056 1.87 11
King Philanthropies 57,287 1.76 7
ECHO 26,789 0.82 3
FCDO 23,282 0.71 3
LIFT 18,958 0.58 9
European Union (EU) 13,882 0.43 4
HELVETAS 13,851 0.42 6


Additionally, we also observe a number of errors, including cases where multiple donors have been combined into one row as well as numerous instances where UNDP, WFP, FAO and UN WOMEN were classified as donors as opposed to reporting organisations. Helvetas should also probably have reported under “organisations using their own funds”.




4. Beneficiaries

4.1 Beneficiary disaggregations

Currently, in the 5Ws, the vast majority of beneficiary diasaggregations have been backfilled from census data and do not, consequently, provide an accurate picture of the population that have been reached by Food Security interventions. It is not possible to determine how far reality diverges from what has been reported so far – meaning that we also cannot determine if there has been any bias in beneficiary selection and targetting. It is imperative to begin collecting disaggregated beneficiary data from partners.

It is entirely possible that partners are collecting this data – disaggregated beneficiary data is one of the most common data required for internal and external reporting – and that it is merely necessary to work with partners to wrangle their data into the 5W format. However, the capacities of partners to disaggregate beneficiary data should be investigated by the cluster and is an important issue that should be brought up in te next plenary session.



4.2 Types of beneficiaries

The states and regions in which we are working the most with IDPs are Bago (East), Kachin, Chin, Shan (North) and Kayah. Overall, 82.68% of beneficiaries are from the host/local community, 9.02% are stateless persons from Rakhine and 8.24% are IDPs. Returnees are the rarest type of beneficiary reached, forming only 0.07% of all beneficiaries reached. Each row in the table below shows the percentage of each beneficiary type within each state/region.

Percentage breakdown of beneficiary types by state/region
state Host/local Community Internally Displaced Returnees Rakhine stateless beneficiaries
Ayeyarwady 100.00 99,481
Bago (East) 66.42 33.31 0.27 12,974
Chin 7.35 92.65 17,005
Kachin 7.68 90.65 1.67 89,818
Kayah 46.88 53.12 17,746
Kayin 67.37 32.63 68,108
Magway 99.03 0.97 96,767
Mandalay 100.00 143,526
Mon 92.50 5.88 1.62 48,181
Rakhine 34.39 10.16 55.45 530,202
Sagaing 25.29 74.71 31,985
Shan (East) 100.00 510
Shan (North) 26.44 73.56 73,103
Shan (South) 100.00 15,511
Tanintharyi 95.64 4.13 0.22 4,476
Yangon 100.00 2,011,575
Total 82.68 8.24 0.07 9.02


Compared to only the 2021 HRP targets (as the IERP does not have breakdowns of the target by beneficiary type), we can see that whilst targets have been mostly exceeded, neither the targets for returnees/resettled in Kachin or Shan (North) nor targets for IDPs in Rakhine or Kayin have been met. Interestingly, for Rakhine, the targets for the host/local population have been greatly exceeded, perhaps indicating that once targets were met, all further allocations were targetted at the host/local communities. In Bago (East), Chin, Kayin and particularly Shan (North), the targets for IDPs have been greatly exceeded, in comparison to the 2021 HRP targets:

Percentage of 2021 HRP target reached by beneficiary type
state host_local% idp% returnees% rakhine_stateless% total%
Bago (East) 171.99 173.38
Chin 0.00 200.74 156.95
Kachin 88.67 110.36 32.88 104.30
Kayin 168.08 196.98
Rakhine 409.86 32.71 105.75 108.83
Shan (North) 135.56 751.31 0.00 400.17
Shan (South) 0.00 0.00


Stateless persons from Rakhine have the largest average household sizes, with returnees having the largest variations in household size. With reference to the plot below, the thick bar in the middle of each box shows the average household size for each beneficiary type – this value is also shown in the text label below the line. The lower and upper borders of each box indicate the values for the 25th and 75th percentiles respectively. For instance, we can see that households at the 25th percentile of households in host/local communities have only four members and households that have around 5 members have more members than 75% of all the households in that group. Outliers are marked by dots. We note a lot of potential data entry errors where less than one person per household was reported.




4.3 Monthly progress by beneficiary type


Whilst the numbers of IDPs and Returnees reached did see significant increases after July 2021, we do not observe any evidence that this was the result of the HRP addendum, rather than the continuation of already existing plans. However, we do note a significant increase in the numbers of persons in the host/local community reached after July 2021 – 75% of all host/local community beneficiaries were reached after the publication of the HRP addendum. Conversely, the progress amongst state Rakhine persons slowed substantially after the publication of the addendum; as we have mentioned earlier, once targets were reached for stateless persons, additional allocations were directed at the host/local community – whether this was due to access issues or that the host/local community in Rakhine were evaluated to be as food insecure as the stateless population remains to be investigated.


Reached by beneficiary type, before and after HRP addendum
beneficiary_type before_addendum after_addendum Total %before %after
Host/local Community 667,103 2,028,907 2,696,010 24.74 75.26
Rakhine stateless 246,891 47,101 293,992 83.98 16.02
Internally Displaced 145,206 123,436 268,642 54.05 45.95
Returnees 1,046 1,278 2,324 45.01 54.99



4.3 Gaps in monthly programming

Number of beneficiaries and locations by duration of gaps in implementation
gap_months locations townships beneficiaries pc_of_ben
0 283 35 457,448 51.48
1 51 21 73,704 8.29
2 122 22 63,397 7.13
3 406 12 236,978 26.67
4 8 5 8,485 0.95
5 9 5 28,195 3.17
8 1 1 20,393 2.29


49% of beneficiaries experienced gaps or delays in monthly programming, with the most common delay being 3 months. The 8-month delay was the provision of monthly food baskets in Buthidaung, where distributions only occurred in February and November 2021. The 5-month delays were all from locations in Rakhine and Kachin. Overall, gaps in monthly programming were experienced in 39 townships, with the majority orginating from Kachin, Ayeyarwady and Rakhine.

There are 276 entries coded as being implemented on a monthly basis that have not recurred – that is, they have only been implemented once: we should check with partners if these are merely the first instances, or if there have been issues with access, security or funding or if they are errors in data entry .



4.4 Potential for post-distribution monitoring

The table below shows activities which have been implemented for 6 months or more, the number of locations they were implemented in and the number of unique beneficiaries reached by activities meeting these criteria. The possibility of joint monitoring – or at least the joint review and analysis of monitoring data – will be explored, in consultation with these partners. The rationale being that 6 months of implementation should be a long enough period of time to make impact monitoring feasible; additionally, joint monitoring will be further facilitated by the similarity of these activities, almost all of which are recurrent cash transfers or distributions of food baskets.

Number of beneficiaries, by activity, who have received at least 6 months of recurrent food security support
activity partners locations beneficiaries
Provide monthly cash-based transfers 7 231 194,400
Provide monthly food baskets 7 44 147,819
Provide technical training 2 413 57,887
Provide crops & vegetables kits 1 406 57,287
Provide support for income generation 1 407 57,287
Cash for Work / Food for Assets 1 1 245


These are the partners who have implemented monthly food baskets and monthly cash-based transfers for more than 6 months:

Partners who have implemented cash transfers and food baskets for at least 6 months
implementing_partners Provide monthly cash-based transfers Provide monthly food baskets
Karuna Mission Social Solidarity 51,702 85
Myanmar Heart Development Organization 30,185 57,638
People for People 23,982
Plan International 37,657
Save the Children 144
WFP 39,192 42,002
World Vision Myanmar 11,538 19,559
Action for Green Earth 18,755
People Hope Community Development (PHCD) 8,872
Together for Sustainable Development 908




5. Next steps

  1. Communicate to partners that Yangon is severely oversubscribed in comparison to the rest of the country, above all in the townships of Hlaingtharya, Shwepyithar, Dagon Myothit (Seikkan), Dala and North Okkalapa.

  2. Collect existing intervention packages from partners in order to begin the process of standardisation and to support the review of food baskets for their caloric and nutritional value. Perform additional analysis to understand if beneficiaries in close proximity to each other have received widely divergent package values. Additionally, speak with partners to understand why cash transfer values vary even within the same activity implemented by the same partner.

  3. Revisit areas which have only received smaller supplementary transfers – a transfer of around USD 10 per household per month cannot be considered to have covered the food security needs for that area – other partners may be necessary to cover the gap.

  4. Advocate for the expansion of partners’ geographic footprints to reach the remaining 179 townships which have yet to benefit from any FSC activities. The effects of the current crisis in Myanmar have not been determined by an epicentre or a stormpath and there is no programmatic rationale for the response to be so uneven. This advocacy should be targetted at the ICCG, Cluster partners and at donors.

  5. Collect 5W data from other clusters so that multi-sector coverage may be reviewed. Clean and process conflict data so that it may be cross-referenced with partners’ coverage. Share raw data with other Clusters to improve coordination.

  6. Work with partners to determine their current capacities to submit age and sex-disaggregated beneficiary data. Develop a workplan to ensure that they can meet reporting requirements.

  7. Solicit monitoring reports from partners and explore the possibility of joint monitoring.

  8. Revise the 5W template – in consultation with partners – in order to address the data collection issues identified.




6. Reference table – townships

The reference table below may be sorted and filtered by any of the columns.




7. Interactive maps – 2022 PIN and 2021 beneficiaries reached


7.1 Map of 2022 PIN by township



7.2 Map of 2021 beneficiaries by township

LS0tDQp0aXRsZTogIkluaXRpYWwgb2JzZXJ2YXRpb25zIG9uIHRoZSBNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciA1V3MiDQphdXRob3I6ICJTZWFuIE5nIg0KZGF0ZTogIjI5LzAxLzIwMjEiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHRydWUgICANCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KDQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiIjsNCiAgZGlzcGxheTogYmxvY2s7DQogIGhlaWdodDogNzBweDsNCiAgbWFyZ2luOiAyZW0gMjBweCA0MHB4IDIwcHg7DQogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiTXlhbm1hcl9jbHVzdGVyX2JsdWUucG5nIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQojIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyByZXBvcnQgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGluaXRpYWwgb2JzZXJ2YXRpb25zIGFuZCBhbmFseXNpcyBwZXJmb3JtZWQgb24gdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciA1V3MgZGF0YSBmb3IgMjAyMTsgdGhlIGlzc3VlcyBpZGVudGlmaWVkIGFuZCBhbmFseXNpcyBoYXZlIGJlZW4gYnJva2VuIGludG8gbGFyZ2UgZ3JvdXBzIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZmlyc3QgNCBjaGFwdGVycyAtLSBnZW9ncmFwaGljYWwgY292ZXJhZ2UsIGFjdGl2aXRpZXMgYW5kIG1vZGFsaXRpZXMsIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzLiBUaGlzIHJlcG9ydCBlbmRzIHdpdGggYSBicmllZiBzZWN0aW9uIG9uIG5leHQgc3RlcHMgYW5kIGFuIGludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBhbmQgaW50ZXJhY3RpdmUgcmVmZXJlbmNlIG1hcHMuDQoNCldlIGhhdmUgZW5kZWF2b3VyZWQgdG8gcHJvdmlkZSBhY3Rpb25hYmxlIGluZm9ybWF0aW9uIGFuZCBiZWxpZXZlIHRoYXQgcmVsZWFzaW5nIHRoaXMgcmVwb3J0IGlzIGEgbmVjZXNzYXJ5IHBhcnQgb2YganVtcC1zdGFydGluZyB0aGUgcHJvY2VzcyBvZiByZXNvbHZpbmcgdGhlIG1vcmUgcHJlc3NpbmcgY29uY2VybnMgaWRlbnRpZmllZC4gRnVydGhlciBhbmFseXNpcyBpcyBtZXJpdGVkIGluIHNldmVyYWwgYXJlYXM7IGFuZCB0aGlzIHdpbGwgYmUgdW5kZXJ0YWtlbiBvbmNlIGNvbnN1bHRhdGlvbnMgd2l0aCBwYXJ0bmVycyBoYXZlIGJlZW4gY29tcGxldGVkLg0KDQpVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgYmVuZWZpY2lhcnkgZmlndXJlcyBpbiB0aGlzIHJlcG9ydCBhcmUgdW5pcXVlIGJlbmVmaWNpYXJpZXMsIGFzIG9wcG9zZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMuDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShib29rZG93bikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZ2dzZmxhYmVsKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHZpcmlkaXMpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gZm9yIHRyYW5zcG9zaW5nIGRmDQp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsNCiAgdF9kZiA8LSBkYXRhLnRhYmxlOjp0cmFuc3Bvc2UoZGYpDQogIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikNCiAgdF9kZiA8LSB0X2RmICU+JQ0KICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC5kYXRhID0gLikgJT4lDQogICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzLCAyIGdyb3VwZWQgdmFyaWFibGVzDQpzdW1fYmVuMiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3ZhcjEsIGNvbHVtbl92YXIyKXsNCiAgDQogIGNvbHVtbl92YXIxIDwtIGVucXVvKGNvbHVtbl92YXIxKQ0KICBjb2x1bW5fdmFyMiA8LSBlbnF1byhjb2x1bW5fdmFyMikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcjEsICEhY29sdW1uX3ZhcjIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoYWRtaW4xcGNvZGVfNDphZG1pbjNwY29kZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfNCwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluM3Bjb2RlLA0KICAgICAgICAgc3RhdGVfbmFtZSAgID0gc3RhdGVfNSwNCiAgICAgICAgIHRvd25zaGlwX25hbWUgID0gY291bnR5KSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpDQoNCiMgbG9jYXRpb25zIGRhdGFzZXQgDQpsb2NhdGlvbnMgPC0gYmluZF9yb3dzKA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgcGF5YW1zIA0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3Qoc3RhdGVfbmFtZTpwYXlhbV9jb2RlKSAlPiUgDQogICAgcmVuYW1lKGFkbWluMV9wY29kZSA9IHN0YXRlX2NvZGVfMTIsDQogICAgICAgICAgIHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZSwgDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IGNvdW50eV9jb2RlLA0KICAgICAgICAgICBsb2NhdGlvbiA9IHBheWFtX25hbWUpICU+JQ0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgicGF5YW0iKSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBjYW1wcw0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3QoY291bnR5X25hbWUxOnBfY29kZV9jYW1wKSAlPiUgDQogICAgcmVuYW1lKHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZTEsDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IHN0YXRlX2NvZGVfMjMsDQogICAgICAgICAgIGxvY2F0aW9uID0gY2FtcHMsIA0KICAgICAgICAgICBjYW1wX3Bjb2RlID0gcF9jb2RlX2NhbXApICU+JSANCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoImNhbXAiKSkgJT4lIA0KICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgICBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogICAgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgcmVsb2NhdGUoc3RhdGVfbmFtZSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBpbmR1c3RyaWFsIHpvbmVzDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgc2VsZWN0KHN0YXRlXzI4OmluZHVzdHJpYWxfem9uZXMpICU+JSANCiAgICByZW5hbWUoc3RhdGVfbmFtZSA9IHN0YXRlXzI4LCANCiAgICAgICAgICAgYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfMjksDQogICAgICAgICAgIGxvY2F0aW9uID0gaW5kdXN0cmlhbF96b25lcykgJT4lDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIHJlZ2V4X2xlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgICAgICAgICBieSA9IGMoImxvY2F0aW9uIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgICAjIHJlcGxhY2luZyB0aGUgTkFzIHdpdGggMHMgc28gdGhlIGZpbHRlciBkb2Vzbid0IGRyb3AgdGhlbSANCiAgICByZXBsYWNlX25hKGxpc3QodG93bnNoaXBfbmFtZSA9IDAsIGFkbWluM19wY29kZSA9IDAsIGFkbWluMV9wY29kZSA9IDApKSAlPiUNCiAgICBmaWx0ZXIoYWRtaW4zX3Bjb2RlICE9ICJNTVIwMTMwNDAiKSAlPiUgIyByZW1vdmluZyBhbGwgdGhlIG1hdGNoZXMgYmV0d2VlbiBIbGFpbmd0aGFyeWEgYW5kIEhsYWluZw0KICAgIGZpbHRlcihhZG1pbjNfcGNvZGUgIT0gIk1NUjAxMTAwNiIpICU+JSAjIHJlbW92aW5nIGFsbCB0aGUgbWF0Y2hlcyBiZXR3ZWVuIFllbmFuZ3lhdW5nIGFuZCBZZQ0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJpbmR1c3RyaWFsX3pvbmUiKSkNCiAgDQopJT4lDQogIG11dGF0ZShsb2NhdGlvbl9jb2RlID0gY2FzZV93aGVuKGxvY2F0aW9uX3R5cGUgPT0gImNhbXAiIH4gY2FtcF9wY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAicGF5YW0iIH4gcGF5YW1fY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAiaW5kdXN0cmlhbF96b25lIiB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUNCiAgbXV0YXRlKGxvY2F0aW9uc19mdXp6eSA9IHN0cl9yZXBsYWNlX2FsbChsb2NhdGlvbiwgIltbOnB1bmN0Ol1dIiwgIiIpKQ0KDQojIHJlYWRpbmcgaW4gNXdzDQpmc2MgPC0gcmVhZF9leGNlbCgNCiAgIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5X0phbiB0byBEZWMgMjAyMSBJTSBDb21iaW5lZF9EcmFmdF8yODAxMjAyMi54bHN4IiwNCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIkZTQyA1VyBBY3Rpdml0ZXMiLA0KICAgICAgICAgICAgICAgICAgc2tpcCA9IDUpICU+JSANCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdChtb250aF9vZl9pbXBsZW1lbnRhdGlvbjpocnBfdmVyc2lvbikgJT4lIA0KICByZW5hbWVfYWxsKH5zdHJfcmVwbGFjZV9hbGwoLiwgIl5udW1iZXJfb2ZfIiwgIiIpKSAlPiUNCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyXyIsICIiKSkgJT4lIA0KICByZW5hbWUoYWRtaW40X3Bjb2RlID0gYWRtaW4zX3Bjb2RlLCANCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluMl9wY29kZSwNCiAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSByZWFjaGVkX2JlbmVmaWNpYXJpZXMsDQogICAgICAgICBob3VzZWhvbGRzID0gcmVhY2hlZF9ob3VzZWhvbGRzLA0KICAgICAgICAgYmVuZWZpY2lhcnlfdHlwZSA9IGJlbmVmaWNpYXJpZXNfdHlwZSkgJT4lIA0KICBtdXRhdGUoaW5kdXN0cmlhbF96b25lcyA9IHJlcGxhY2UoaW5kdXN0cmlhbF96b25lcywgaW5kdXN0cmlhbF96b25lcyA9PSAiTm8iLCBOQSksDQogICAgICAgICBmcmVxdWVuY3kgPSByZXBsYWNlKGZyZXF1ZW5jeSwgZnJlcXVlbmN5ID09ICJOL0EiLCBOQSkpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uID0gY2FzZV93aGVuKGNhbXAgIT0gIk5BIiB+IGNhbXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyaWFsX3pvbmVzICE9ICJOQSIgfiBpbmR1c3RyaWFsX3pvbmVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlsbGFnZV93YXJkX3Rvd24gIT0gIk5BIiB+IHZpbGxhZ2Vfd2FyZF90b3duKSkgJT4lIA0KICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiAiY2FtcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyaWFsX3pvbmVzICE9ICJOQSIgfiAiaW5kdXN0cmlhbF96b25lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiAidmlsbGFnZV93YXJkX3Rvd24iKSkgJT4lDQogIG11dGF0ZShsb2NhdGlvbnNfZnV6enkgPSBzdHJfcmVwbGFjZV9hbGwobG9jYXRpb24sICJbWzpwdW5jdDpdXSIsICIgIikpICU+JSANCiAgbXV0YXRlKHRvdGFsX3ZhbHVlX21tayA9IHZhbHVlX3Blcl9ob3VzZWhvbGQgKiBob3VzZWhvbGRzKSAlPiUgDQogIG11dGF0ZShkYXRlID0gbXkobW9udGhfb2ZfaW1wbGVtZW50YXRpb24pKSAlPiUgDQogIG11dGF0ZSh1X2JlbiA9IGlmZWxzZSh1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiwgYmVuZWZpY2lhcmllcywgMCkpICU+JSANCiAgbXV0YXRlKHN0YXRlID0gYXMuY2hhcmFjdGVyKGZjdF9yZWNvZGUoc3RhdGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLYWNoaW4iID0gImthY2hpbiIpKSkgJT4lIA0KICBtdXRhdGUobW1rX2hoZF9iaW4gPSBjYXNlX3doZW4odmFsdWVfcGVyX2hvdXNlaG9sZCA8IDEwMDAwIH4gImJlbG93XzEwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPj0gMTAwMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkIDw9IDIwMDAwIH4gIjEwa18yMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID4gMjAwMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkIDw9IDUwMDAwIH4gIjIwa181MGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID4gNTAwMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkIDw9IDcwMDAwIH4gIjUwa183MGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID4gNzAwMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkIDwgMTAwMDAwIH4gIjcwa18xMDBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+PSAxMDAwMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkIDwgMjAwMDAwIH4gIjEwMGtfMjAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPj0gMjAwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSAzMDAwMDAgfiAiMjAwa18zMDBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDMwMDAwMCB+ICJhYm92ZV8zMDBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgbW1rX2hoZF9iaW4gPSBmY3RfcmVsZXZlbChtbWtfaGhkX2JpbiwgYygibGVzc190aGFuXzEwayIsICIxMGtfMjBrIiwiMjBrXzUwayIsICI1MGtfNzBrIiwgIjcwa18xMDBrIiwgIjEwMGtfMjAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwa18zMDBrIiwibW9yZV90aGFuXzMwMGsiKSksDQogICAgICAgICBmcmVxdWVuY3kgPSByZWNvZGUoZnJlcXVlbmN5LCAibW9udGhseSIgPSAiTW9udGhseSIpKSAlPiUNCiAgbXV0YXRlKHVzZF9oaGRfYmluID0gDQogICAgICAgICAgIGNhc2Vfd2hlbih2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDEwIH4gIjwkMTAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMTAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDIwIH4gIj49JDEwXzwkMjAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMjAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDQwIH4gIj49JDIwXzwkNDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gNDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDYwIH4gIj49JDQwXzwkNjAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gNjAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDEwMCB+ICI+PSQ2MF88JDEwMCIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA+PSAxMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDIwMCB+ICI+PSQxMDBfPCQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMjAwIH4gIj49JDIwMCIsDQogICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksDQogICAgICAgICB1c2RfaGhkX2JpbiA9IGZjdF9yZWxldmVsKHVzZF9oaGRfYmluLCBjKCI8JDEwIiwgIj49JDEwXzwkMjAiLCAiPj0kMjBfPCQ0MCIsICI+PSQ0MF88JDYwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQ2MF88JDEwMCIsICI+PSQxMDBfPCQyMDAiLCAiPj0kMjAwIikpKSAlPiUgDQogIG11dGF0ZShocnBfaW5kaWNhdG9yID0NCiAgICAgICAgICByZWNvZGUoaHJwX2luZGljYXRvciwNCiAgICAgICAgICAiTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlIiA9IA0KICAgICAgICAgICAgIjEuTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlIiwNCiAgICAgICAgICAiTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgYWdyaWN1bHR1cmUgYW5kIG90aGVyIGxpdmVsaWhvb2Qgc3VwcG9ydCwgY29udHJpYnV0aW5nIHRvIGhvdXNlaG9sZCBmb29kIHNlY3VyaXR5IiA9DQogICAgICAgICAgICAiMi5OdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBzdHJfdHJpbShiZW5lZmljaWFyeV90eXBlKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgICAgIlJha2hpbmUgc3RhdGVsZXNzIiA9ICJOb24tZGlzcGxhY2VkIHN0YXRlbGVzcyBwZW9wbGUgaW4gUmFraGluZSIpKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHkgPSByZWNvZGUoYWN0aXZpdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyB0aHJvdWdoIGluLWtpbmQgYXNzaXN0YW5jZSB0byBhY3V0ZWx5IGZvb2QgaW5zZWN1cmUgcG9wdWxhdGlvbiBpbiBydXJhbCBhcmVhcyIgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIHRlY2huaWNhbCB0cmFpbmluZyAoYWdyaWN1bHR1cmUsIGxpdmVzdG9jayBicmVlZGluZywgbGl2ZWxpaG9vZCkiID0gIlByb3ZpZGUgdGVjaG5pY2FsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgc3VwcG9ydCBmb3IgSW5jb21lIEdlbmVyYXRpbmcgQWN0aXZpdGllcyIgPSAiUHJvdmlkZSBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgdG8gYWN1dGVseSBmb29kIGluc2VjdXJlIHBvcHVsYXRpb24gaW4gcnVyYWwgYXJlYXMiID0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc2ggZm9yIFdvcmsgLyBGb29kIGZvciBBc3NldHMgYWN0aXZpdGllcyIgPSAiQ2FzaCBmb3IgV29yayAvIEZvb2QgZm9yIEFzc2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGZpc2hlcnkga2l0cyAoaW4ta2luZCAvIENCVCkiID0gIlByb3ZpZGUgZmlzaGVyeSBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgY3JvcHMgJiB2ZWdldGFibGVzIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGNyb3BzICYgdmVnZXRhYmxlcyBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbGl2ZXN0b2NrIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGxpdmVzdG9jayBraXRzIikpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVycyA9IHJlY29kZShpbXBsZW1lbnRpbmdfcGFydG5lcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYXZlIHRoZSBjaGlsZHJlbiIgPSAiU2F2ZSB0aGUgQ2hpbGRyZW4iKSkgJT4lIA0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSA9IA0KICAgICAgICAgICBpZmVsc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzICVpbiUgYygiS2F3IExhaCBGb3VuZGF0aW9uIiwgIkhha2hhIEJhcHRpc3QgQXNzb2NpYXRpb24gKEhCQSkiLCAiQXJrYW4gUmVzZWFyY2ggYW5kIFdhdGNoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhsYWluZyBEZXZlbG9wbWVudCBOZXR3b3JrIiwgIk1hbmdyb3ZlIFNlcnZpY2UgTmV0d29yayAoTVNOKSIsICJLeWFsIFNpbiBNYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dhbiBTYXVuZyBTaGluIiwgIlNlaW4gTGVpIEF5ZXlhciIpLCAiTk5HTyIsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpLA0KICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSA9IA0KICAgICAgICAgICBpZmVsc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzICVpbiUgYygiU2luZ2xlIFRvdWNoIFBvaW50IENvbXBhbnkgTGltaXRlZCAoU1RQKSIsICJOZW8gUHJvc3BlY3QgQ29tcGFueSBMaW1pdGVkIiksIA0KICAgICAgICAgICAgICAgICAgIm90aGVyIiwgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSksDQogICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlID0gaWZlbHNlKGltcGxlbWVudGluZ19wYXJ0bmVycyA9PSAiSGVsZW4gS2VsbGVyIEludGVybmF0aW9uYWwiLCAiSU5HTyIsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpKQ0KDQoNCiMgYmVuIGRhdGFzZXQgLS0gdGlkeSBmb3JtYXQgNVdzIGZvciBiZW5lZmljaWFyaWVzIA0KYmVuIDwtIGZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lICANCiAgc2VsZWN0KGRhdGUsDQogICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsDQogICAgICAgICBzdGF0ZSwgdG93bnNoaXAsIHZpbGxhZ2Vfd2FyZF90b3duLCBsb2NhdGlvbiwgbG9jYXRpb25fdHlwZSwgYWRtaW4xX3Bjb2RlLCBhZG1pbjNfcGNvZGUsDQogICAgICAgICBhY3Rpdml0eSwgYWN0aXZpdHlfc3RhdHVzLCBocnBfaW5kaWNhdG9yLCBiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgIGNoaWxkX21hbGUsIGNoaWxkX2ZlbWFsZSwgYWR1bHRfbWFsZSwgYWR1bHRfZmVtYWxlLCBlbGRlcmx5X21hbGUsIGVsZGVybHlfZmVtYWxlKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY2hpbGRfbWFsZTplbGRlcmx5X2ZlbWFsZSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJkaXNhZ2dyZWdhdGlvbiIsIHZhbHVlc190byA9ICJiZW5lZmljaWFyaWVzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKQ0KIA0KDQojIHJlYWRpbmcgaW4gcGluIGFuZCB0YXJnZXRzDQpwaW4gPC0gcmVhZF9leGNlbCgiUElOIGNhbGN1bGF0aW9uIEZvb2QgU2VjdXJpdHkgQ2x1c3Rlcl9Ub3duc2hpcCBCcmVha2Rvd24ueGxzeCIsDQogICAgICAgICAgIHNoZWV0ID0gIkZvb2QgU2VjIFBpTiB3aXRoIElEUHMiLCANCiAgICAgICAgICAgc2tpcCA9IDIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtYyh4MTcsIHgxOCwgeDE5KSkgJT4lIA0KICBzbGljZSgxOjM0NikgJT4lIA0KICBmaWxsKHJlZ2lvbikgJT4lIA0KICByZW5hbWUoc3RhdGUgPSByZWdpb24sDQogICAgICAgICBpZHBzID0gaWRfcHMsIA0KICAgICAgICAgcG9wX21pbnVzX2lkcHMgPSBwb3B1bGF0aW9uX21pbnVzX2lkX3BzLCANCiAgICAgICAgIHBpbl8yMDIyID0gdnVsbmVyYWJsZV9mb29kX2luc2VjdXJlX3Blb3BsZV9pZF9wcykgJT4lICANCiAgZmlsdGVyKHRvd25zaGlwICE9ICJUb3RhbCIpICU+JSAgDQogIG11dGF0ZV9hdCh2YXJzKHBvcF9taW51c19pZHBzOm1vZGVyYXRlbHlfc2V2ZXJlbHkpLCB+IGFzLm51bWVyaWMoLikpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcywgYnkgPSBjKCJ0b3duc2hpcCIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogIHNlbGVjdCgtc3RhdGUpICU+JSAgDQogIHJlbG9jYXRlKGFkbWluM19wY29kZSkgJT4lIHJlbG9jYXRlKHN0YXRlID0gc3RhdGVfbmFtZSkgJT4lIHJlbG9jYXRlKGFkbWluMV9wY29kZSkgJT4lIA0KICBtdXRhdGUocGNfdnVsID0gcGluXzIwMjIgLyB0b3RhbF9wb3AsDQogICAgICAgICBwaW5fMjAyMiA9IHJvdW5kKHBpbl8yMDIyLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVhZF9leGNlbCgiRlNDIFBJTiBhbmQgVGFyZ2V0IF9jb21iaW5lIEhSUCBhbmQgSUVSUCAyMDIxLnhsc3giKSAlPiUNCiAgICAgICAgICAgICAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM19wY29kZSA9IHRzcF9wY29kZSwgcGluXzIwMjEgPSBwaW4sIHRhcmdldF8yMDIxID0gdGFyZ2V0KSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4ocmVhZF9leGNlbCgiZnNfdGFyZ2V0c18yMDIxLnhsc3giKSAlPiUNCiAgICAgICAgICAgICAgY2xlYW5fbmFtZXMoKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCh0b3duc2hpcCA9IHgxLA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9pZHBzXzIwMjEgPSBpbnRlcm5hbGx5X2Rpc3BsYWNlZF9wZXJzb25zXzEyLA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9yZXR1cm5lZXNfMjAyMSA9IGlkcF9yZXR1cm5lZXNfcmVzZXR0bGVkX2xvY2FsbHlfaW50ZWdyYXRlZF8xMywNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfc3RhdGVsZXNzX3Jha2hpbmVfMjAyMSA9IG5vbl9kaXNwbGFjZWRfc3RhdGVsZXNzX3Blb3BsZV9pbl9yYWtoaW5lXzE0LA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEgPSBvdGhlcl92dWxuZXJhYmxlX2NyaXNpc19hZmZlY3RlZF9wZW9wbGVfMTUsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X3RvdGFsID0gdG90YWxfMTYpICU+JQ0KICAgICAgICAgICAgICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSAgc2VsZWN0KHRvd25zaGlwX25hbWUsIGFkbWluM19wY29kZSksIGJ5ID0gYygidG93bnNoaXAiID0gInRvd25zaGlwX25hbWUiKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLXRvd25zaGlwKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgICAgDQoNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKQ0KDQojIGZvciByZWxldmVsbGluZyAtLSB0aGlzIGlzIGluIG9yZGVyIG9mIGJlbmVmaWNpYXJpZXMNCnNyX29yZCA8LSBjKCJZYW5nb24iLCAiUmFraGluZSIsICJNYW5kYWxheSIsICJBeWV5YXJ3YWR5IiwgIk1hZ3dheSIsICJLYWNoaW4iLCAiU2hhbiAoTm9ydGgpIiwgIktheWluIiwNCiAiTW9uIiwgIlNhZ2FpbmciLCAiS2F5YWgiLCAiQ2hpbiIsICJTaGFuIChTb3V0aCkiLCAiQmFnbyAoRWFzdCkiLCAiVGFuaW50aGFyeWkiLCAiU2hhbiAoRWFzdCkiKQ0KDQojIGZvciBwcmludGluZyB0aGUgdGFyZ2V0cyBvZiB0aGUgcGluIA0KdGFyZ2V0X2Jlbl8yMDIxIDwtIHBpbiAlPiUgIA0KICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgdG93bnNoaXAsIHRhcmdldF8yMDIxKSAlPiUgDQogIGZpbHRlcih0YXJnZXRfMjAyMSA+IDApICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKHBjX3JlYWNoZWQgPSBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0XzIwMjEgKiAxMDApICU+JSAgDQogIHJlcGxhY2UoaXMubmEoLiksIDApIA0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDEuIEdlb2dyYXBoaWNhbCBjb3ZlcmFnZQ0KDQojIyMgMS4xIENvbXBhcmluZyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYW5kIDIwMjEgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KQSB0b3RhbCBvZiBgciBzdW0oYmVuJGJlbmVmaWNpYXJpZXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB1bmlxdWUgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gcmVhY2hlZCBhY3Jvc3MgdGhlIGNvdW50cnk7IHRoaXMgaXMgYHIgcm91bmQoc3VtKGJlbiRiZW5lZmljaWFyaWVzKSAvIHN1bShwaW4kdGFyZ2V0XzIwMjEpICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSB0YXJnZXR0ZWQgYHIgc3VtKHBpbiR0YXJnZXRfMjAyMSkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnM7IGhvd2V2ZXIsIG5vdCBhbGwgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBjb3JyZXNwb25kZWQgdG8gYXJlYXMgd2hlcmUgdGhlcmUgd2VyZSB0YXJnZXRzIC0tIHRoaXMgaXMgZXhwbG9yZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdG93bnNoaXBzLg0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3Qtc3RhdGUtYmVuZWZpY2lhcmllcy1waW59DQojIGNoYW5nZSB0aGUgY29sb3VycyAtLSBJIHJlYWxseSBkb24ndCBsaWtlIHRoZXNlIGNvbG91cnMgDQoNCnBpbiAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAwLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0YXJnZXRfMjAyMSA9IHN1bSh0YXJnZXRfMjAyMSksIA0KICAgICAgICAgICAgcGluXzIwMjEgPSBzdW0ocGluXzIwMjEpKSAlPiUgDQogIGZpbHRlcihwaW5fMjAyMSA+IDAgfCBiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBwaXZvdF9sb25nZXIoLXN0YXRlLCBuYW1lc190byA9ICJ0eXBlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmY3RfcmVsZXZlbChzdGF0ZSwgc3Jfb3JkKSwgeSA9IHZhbHVlLCBmaWxsID0gZmN0X3JlbGV2ZWwodHlwZSwgYygiYmVuZWZpY2lhcmllcyIsICJ0YXJnZXRfMjAyMSIsICJwaW5fMjAyMSIpKSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNCwgYW5nbGUgPSA3MCkpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiRm9vZCBzZWN1cml0eSBiZW5lZmljaWFyaWVzIGFuZCBwZW9wbGUgaW4gbmVlZCAoMjAyMSkiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwMDAwMDAsIGJ5ID0gMjAwMDAwKSwgbGFiZWxzID0gY29tbWEpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDEuMiBUYWJsZSBvZiBiZW5lZmljaWFyaWVzIGFuZCBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyaWVzLXBpbi1zdGF0ZX0NCiMgY2hhbmdlIGZvcm11bGFzIHRvIGxvb2sgYXQgJSBvZiB0YXJnZXQgYW5kIHNob3cgUElOLCB0YXJnZXQgYW5kIGFjaGlldmVtZW50IGluIHRoZSB0YWJsZSANCnBpbiAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAwLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0YXJnZXQgPSByb3VuZChzdW0odGFyZ2V0XzIwMjEpLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICAgICBQSU4gPSByb3VuZChzdW0ocGluXzIwMjEpLCBkaWdpdHMgPSAwKSkgJT4lDQogIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCB8IFBJTiA+IDApICU+JSANCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX3RhcmdldF9yZWFjaGVkYCA9IGlmZWxzZShpcy5pbmZpbml0ZShiZW5lZmljaWFyaWVzIC8gdGFyZ2V0ICogMTAwKSwgTkFfcmVhbF8sIGJlbmVmaWNpYXJpZXMgLyB0YXJnZXQgKiAxMDApLA0KICAgICAgICAgYCVfdGFyZ2V0X3JlYWNoZWRgID0gcm91bmQoYCVfdGFyZ2V0X3JlYWNoZWRgLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSByb3VuZCh0YXJnZXQgLyBzdW0odGFyZ2V0KSAqIDEwMCwgZGlnaXRzID0gMikpICAlPiUgDQogIHJlbG9jYXRlKGAlX29mX2JlbmAsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcmVsb2NhdGUoYCVfdGFyZ2V0X3JlYWNoZWRgLCAuYWZ0ZXIgPSB0YXJnZXQpICU+JSANCiAgcmVsb2NhdGUoYCVfb2ZfdGFyZ2V0YCwgLmFmdGVyID0gdGFyZ2V0KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBrYmwoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgKGRlc2MuKSBhbmQgUElOIGJ5IHN0YXRlL3JlZ2lvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGxpZ2h0YWJsZV9vcHRpb25zID0gYygic3RyaXBlZCIpKQ0KYGBgDQoNCjxicj4NCg0KWWFuZ29uIGFuZCBSYWtoaW5lIGZvcm0gYm90aCBgciByb3VuZChmaWx0ZXIocGluLCBzdGF0ZSAlaW4lIGMoIllhbmdvbiIsICJSYWtoaW5lIikpICU+JSB7c3VtKC4kdGFyZ2V0XzIwMjEpfSAvIHN1bShwaW4kdGFyZ2V0XzIwMjEpICogMTAwKWAlIG9mIHRoZSB0YXJnZXQgYW5kIGByIHJvdW5kKGZpbHRlcihmc2MsIHN0YXRlICVpbiUgYygiWWFuZ29uIiwgIlJha2hpbmUiKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAvIGZpbHRlcihmc2MsIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAqIDEwMClgJSBvZiB0aGUgYmVuZWZpY2lhcmllcyByZWFjaGVkLiBNYW5kYWxheSBoYXMgaGFzIHRoZSBsYXJnZXN0IGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXRzIGFuZCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIFRoZXJlIHdlcmUgZml2ZSBzdGF0ZXMgKEF5ZXlhcndhZHksIE1vbiwgU2FnYWluZywgTWFnd2F5IGFuZCBUYW5pbnRoYXJ5aSkgd2hlcmUgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYnV0IHdlcmUgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIDIwMjEgdGFyZ2V0IG9yIFBJTjsgaG93ZXZlciwgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiB0aGVzZSBhcmVhcyByZXByZXNlbnQgbGVzcyB0aGFuIDUlIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIEFkZGl0aW9uYWxseSwgdGFyZ2V0cyBoYXZlIGJlZW4gZXhjZWVkZWQgaW4gYWxsIHN0YXRlcyBleGNlcHQgTWFuZGFsYXksIHdpdGggS2F5aW4gaGF2aW5nIHJlYWNoZWQgOTk0JSBvZiBpdHMgdGFyZ2V0IG9mIDYsODU1IHBlcnNvbnMuDQoNCkhvd2V2ZXIsIG1vdmluZyBmb3J3YXJkLCB0aGUgUElOIGZvciAyMDIyIGlzIG11Y2ggbW9yZSBldmVubHkgc3ByZWFkIGFjcm9zcyB0aGUgY291bnRyeTogd2l0aCByZWZlcmVuY2UgdG8gdGhlIHBsb3QgYmVsb3csIFlhbmdvbiwgYWxvbmcgd2l0aCBNYWd3YXkgYW5kIE1hbmRhbGF5IGhhdmUgc29tZSBvZiB0aGUgbG93ZXN0IHByb3BvcnRpb25zIG9mIHZ1bG5lcmFibGUgcGVyc29ucyBpbiByZWxhdGlvbiB0byB0aGUgdG90YWwgc3RhdGUgcG9wdWxhdGlvbiwgbWVhbmluZyB0aGF0IGNhcmVmdWwgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGFuZCB0aWdodCB2dWxuZXJhYmlsaXR5IGluIHRoZXNlIGFyZWFzIHdpbGwgbmVjZXNzYXJ5IHRvIGF2b2lkIGV4Y2Vzc2l2ZSBpbmNsdXNpb24gZXJyb3JzLg0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtcGluLXZ1bC1zdGF0ZX0NCnBpbiAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIGZpbHRlcihzdGF0ZSAhPSAiTmF5IFB5aSBUYXciKSAlPiUgDQogIHN1bW1hcmlzZShwaW5fMjAyMiA9IHJvdW5kKHN1bShwaW5fMjAyMikpLA0KICAgICAgICAgICAgdG90YWxfcG9wID0gc3VtKHRvdGFsX3BvcCkpICU+JSANCiAgbXV0YXRlKGAlX29mX3BvcF9pbl9QSU5gID0gcm91bmQocGluXzIwMjIgLyB0b3RhbF9wb3AgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgc3RhdGUgPSByZW9yZGVyKHN0YXRlLCAtYCVfb2ZfcG9wX2luX1BJTmApKSAgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IHBpbl8yMDIyLCBmaWxsID0gYCVfb2ZfcG9wX2luX1BJTmApKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYCVfb2ZfcG9wX2luX1BJTmApLCBzaXplID0gMi41LCB2anVzdCA9IC0wLjUpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3MCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMC42KSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBwZW9wbGUgaW4gbmVlZCIsIA0KICAgICAgIGZpbGwgPSAiJSBvZiBwb3AgXG4gaW4gUElOIiwNCiAgICAgICB0aXRsZSA9ICIyMDIyIFBJTiBhbmQgaW5jaWRlbmNlIG9mIGZvb2QgaW5zZWN1cml0eSBhbmQgZGlzcGxhY2VtZW50IGJ5IHN0YXRlIGFuZCByZWdpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSAyMDIyIGZvb2Qgc2VjdXJpdHkgUElOIGlzIHRoZSBudW1iZXIgb2YgcGVyc29ucyB3aG8gYXJlIGZvb2QgaW5zZWN1cmUgb3IgYXJlIElEUHMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHJhbnMgPSAicmV2ZXJzZSIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDEuMyBUb3duc2hpcC1sZXZlbCBkaXN0cmlidXRpb24gb2YgYmVuZWZpY2lhcmllcw0KDQpgYGB7ciBkYXRhc2V0LXRzLXRhcmdldC1yZWFjaGVkfQ0KDQp0c190YXJnZXRfcmVhY2hlZCA8LSBwaW4gJT4lICANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgc3RhdGUsIHRvd25zaGlwLCB0YXJnZXRfMjAyMSkgJT4lIA0KICBmaWx0ZXIodGFyZ2V0XzIwMjEgPiAwKSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gYmVuZWZpY2lhcmllcyAvIHRhcmdldF8yMDIxICogMTAwKSAlPiUgDQogIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSBhcnJhbmdlKGRlc2MocGNfcmVhY2hlZCkpDQoNCmBgYA0KDQpKdXN0IGFzIHRoZSByZXNwb25zZSBpcyBoZWF2aWx5IHdlaWdodGVkIHRvd2FyZHMgWWFuZ29uIGFuZCBSYWtoaW5lIGF0IHRoZSBzdGF0ZSBhbmQgcmVnaW9uIGxldmVsLCB0aGUgc2FtZSBpcyBhbHNvIHRydWUgYXQgdGhlIHRvd25zaGlwIGxldmVsLiBUaGVzZSAxMCB0b3duc2hpcHMgYmVsb3cgYXJlIHdoZXJlIDc2JSBvZiBhbGwgRlNDIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIHJlYWNoZWQsIHRoZXkgcmVwcmVzZW50IDYwJSBvZiB0aGUgMjAyMSB0YXJnZXQuIEluIHBhcnRpY3VsYXIsIEhsYWluZ3RoYXJ5YSBoYXMgYmVuZWZpY2lhcnkgZmlndXJlcyB0aGF0IGFyZSAzNzglIG9mIGl0cyB0YXJnZXQuIEFkZGl0aW9uYWxseSwgbmVpdGhlciBOeWF1bmctVSBub3IgTXlpbmd5YW4gd2VyZSB0YXJnZXR0ZWQgYXMgcGFydCBvZiB0aGUgMjAyMSBQSU4gZGVzcGl0ZSBiZWluZyBpbiB0aGUgdG9wIDEwIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgLS0gYHIgcm91bmQoc3VtKHRzX3RhcmdldF9yZWFjaGVkJGJlbmVmaWNpYXJpZXMpIC8gc3VtKGJlbiRiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgY29ycmVzcG9uZGVkIHRvIHRvd25zaGlwcyB3aXRoIHRhcmdldHMuDQoNCmBgYHtyIHRhYmxlLXRvcC10b3duc2hpcHMtYmVuZWZpY2lhcmllc30NCiMgY2hlY2sgdGhlIHBhcmFncmFwaCB0ZXh0IGFib3ZlIGlmIHlvdSByZXJ1biB0aGUgcmVwb3J0IG9uIG5ldyBkYXRhIA0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCB0b3duc2hpcCwgc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUgc2VsZWN0KGFkbWluM19wY29kZSwgdGFyZ2V0ID0gdGFyZ2V0XzIwMjEpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSBpZmVsc2UoaXMuaW5maW5pdGUodGFyZ2V0IC8gc3VtKHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMCksIE5BX3JlYWxfLCB0YXJnZXQgLyBzdW0odGFyZ2V0LCBuYS5ybSA9IFRSVUUpICogMTAwKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSByb3VuZChgJV9vZl90YXJnZXRgLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlcmVhY2hlZGAgPSBpZmVsc2UoaXMuaW5maW5pdGUoYmVuZWZpY2lhcmllcyAvIHRhcmdldCAqIDEwMCksIE5BX3JlYWxfLCBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0ICogMTAwKSwNCiAgICAgICAgIGAlcmVhY2hlZGAgPSByb3VuZChgJXJlYWNoZWRgLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICB0YXJnZXQgPSByb3VuZCh0YXJnZXQpKSAlPiUgDQogIHNlbGVjdCgtYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHJlbG9jYXRlKGAlX29mX2JlbmAsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcmVsb2NhdGUoc3RhdGUsIC5hZnRlciA9IHRvd25zaGlwKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBoZWFkKDEwKSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgMTAgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCAoZGVzYykgaW4gMjAyMSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGxpZ2h0YWJsZV9vcHRpb25zID0gYygic3RyaXBlZCIpKQ0KYGBgDQoNCjxicj4NCg0KDQpgciBiZW4gJT4lIHNlbGVjdCh0b3duc2hpcCkgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgdG93bnNoaXBzIGhhdmUgYmVlbiByZWFjaGVkIGJ5IGZvb2Qgc2VjdXJpdHkgYWN0aXZpdGllcyBpbiB0aGUgZmlyc3QgdGhyZWUtcXVhcnRlcnMgb2YgMjAyMS4gVGhpcyBpcyBgciByb3VuZChiZW4gJT4lIHNlbGVjdCh0b3duc2hpcCkgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKSAvIG5yb3codG93bnNoaXBzKSAqIDEwMCwgZGlnaXRzID0gMilgJSB0aGUgMzMwIHRvd25zaGlwcyBpbiB0aGUgY291bnRyeS4gSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHR3byB0b3duc2hpcHMgLS0gSHBhcHVuIGluIEtheWluIGFuZCBLeWV0aGkgaW4gU2hhbiAoU291dGgpIGhhdmUgYmVlbiB0YXJnZXR0ZWQgc2luY2UgdGhlIGluaXRpYWwgMjAyMSBIUlAsIHlldCBoYXZlIG5vdCBiZWVuIHJlYWNoZWQgYnkgYW55IEZTQyBhY3Rpdml0aWVzOyBgciBmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIGJlbmVmaWNpYXJpZXMgPT0gMCkgJT4lIG5yb3dgIHRvd25zaGlwcywgb3ZlcmFsbCwgaW4gZWl0aGVyIHRoZSBIUlAgb3IgSUVSUCwgaGF2ZSBub3QgYmVuZWZpdHRlZCBmcm9tIGFueSBGU0MgYWN0aXZpdGllcy4NCg0KT3ZlcmFsbCwgYHIgcm91bmQoc3VtKHRhcmdldF9iZW5fMjAyMSRiZW5lZmljaWFyaWVzKSAvIHN1bSh0YXJnZXRfYmVuXzIwMjEkdGFyZ2V0XzIwMjEpICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSB0YXJnZXR0ZWQgcG9wdWxhdGlvbiB3YXMgcmVhY2hlZC4gRnJvbSB0aGUgaGlzdG9ncmFtIGJlbG93LCB3ZSBjYW4gc2VlIHRoYXQgb3ZlcnJlYWNoIGFuZCB1bmRlci1yZWFjaGluZyB3ZXJlIHZlcnkgY29tbW9uIC0tIHRvd25zaGlwcyBhcmUgY29tbW9ubHkgY2x1c3RlcmVkIGF0IGFyb3VuZCAwJSByZWFjaGVkIGFuZCBhbHNvIGF0IDIwMCUgcmVhY2hlZCBvciBtb3JlLiBPZiB0aGUgYHIgbnJvdyhmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIGJlbmVmaWNpYXJpZXMgIT0gMCkpYCB0b3duc2hpcHMgcmVhY2hlZCBpbiAyMDIxOyBgciBucm93KGZpbHRlcih0c190YXJnZXRfcmVhY2hlZCwgcGNfcmVhY2hlZCA+IDEyMCkpYCB0b3duc2hpcHMgcmVhY2hlZCBtb3JlIHRoYW4gMTIwJSBvZiB0aGVpciB0YXJnZXQsIGByIG5yb3coZmlsdGVyKHRzX3RhcmdldF9yZWFjaGVkLCBwY19yZWFjaGVkID4gMTAwICYgcGNfcmVhY2hlZCA8PSAxMjApKWAgcmVhY2hlZCBiZXR3ZWVuIDEwMCUgYW5kIDExOSUgb2YgdGhlaXIgdGFyZ2V0OyBgciBucm93KGZpbHRlcih0c190YXJnZXRfcmVhY2hlZCwgcGNfcmVhY2hlZCA+IDgwICYgcGNfcmVhY2hlZCA8PSAxMDApKWAgdG93bnNoaXBzIHJlYWNoZWQgYmV0d2VlbiA4MCUgYW5kIDEwMCUgb2YgdGhlaXIgdGFyZ2V0OyBhbmQgYHIgbnJvdyhmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIHBjX3JlYWNoZWQgPD0gODAgJiBwY19yZWFjaGVkICE9IDApKWAgdG93bnNoaXBzIHJlYWNoZWQgbGVzcyB0aGFuIDgwJSBvZiB0aGVpciB0YXJnZXQuDQoNCjxicj4NCg0KYGBge3IgaGlzdG9ncmFtLWJlbmVmaWNpYXJpZXMtaHJwLXRhcmdldC1yZWFjaGVkfQ0KDQp0c190YXJnZXRfcmVhY2hlZCAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gaWZlbHNlKHBjX3JlYWNoZWQgPiAyMDAsIDIwMCwgcGNfcmVhY2hlZCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCkpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyMCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAsIGJ5ID0gMjApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgDQogIGxhYnMoeCA9ICIlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIiwNCiAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdG93bnNoaXBzIGJ5IHBlcmNlbnRhZ2Ugb2YgMjAyMSBIUlAgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJWYWx1ZXMgYWJvdmUgMjAwJSBoYXZlIGJlZW4gbHVtcGVkIHRvZ2V0aGVyIGF0IDIwMCUiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAxLjQgTG9jYXRpb25zDQoNClBhcnRuZXJzIGhhdmUgcmVzcG9uZGVkIGluIGEgdG90YWwgb2YgYHIgYmVuICU+JSBzZWxlY3QobG9jYXRpb24pICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGxvY2F0aW9ucyBhY3Jvc3MgdGhlIGNvdW50cnksIHdpdGggdGhlIHZhc3QgbWFqb3JpdHkgb2YgbG9jYXRpb25zIG9ubHkgaGF2aW5nIG9ubHkgb25lIHBhcnRuZXIgb3BlcmF0aW5nIGluIHRoZW07IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0bmVycyBpbiBhbnkgbG9jYXRpb24gaXMgNC4gT2YgdGhlIGByIGZzYyAlPiUgbnJvdygpYCByb3dzIHJlcG9ydGVkIGluIHRoZSA1V3MsIG9ubHkgYHIgc3VtKGlzLm5hKGZzYyRsb2NhdGlvbikpYCBkaWQgbm90IHJlcG9ydCBhIHNwZWNpZmljIGxvY2F0aW9uLg0KDQpMb2NhdGlvbnMgYXJlIGNsYXNzaWZpZWQgaW50byB0aHJlZSBncm91cHMgLS0gY2FtcHMsIGluZHVzdHJpYWwgem9uZXMgYW5kIHZpbGxhZ2VzL3Rvd25zL3dhcmRzOg0KDQpgYGB7ciB0YWJsZS1sb2NhdGlvbnN9DQoNCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdCh0b3duc2hpcCksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBhdmdfYmVuX3Blcl9sb2MgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gbG9jYXRpb25zLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlN1bW1hcnkgb2YgbG9jYXRpb24gdHlwZXMiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpDQogICMgcGFuZGVyKGNhcHRpb24gPSAiU3VtbWFyeSBvZiBsb2NhdGlvbiB0eXBlcyIpDQpgYGANCg0KPGJyPg0KDQpUaGUgdmFzdCBtYWpvcml0eSBvZiBsb2NhdGlvbnMgYXJlIHNlcnZlZCBieSBvbmx5IG9uZSBwYXJ0bmVyLiBCZWxvdyBhcmUgYSBzZXJpZXMgb2YgaGlzdG9ncmFtcyBzaG93aW5nIHRoZSB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9uLCBzcGxpdCBieSBudW1iZXIgb2YgcGFydG5lcnMgaW4gZWFjaCBsb2NhdGlvbi4gTG9jYXRpb25zIHdpdGggb25lIHBhcnRuZXIgcHJlc2VudCBoYXZlIGEgbGFyZ2UgcGVhayBhcm91bmQgMTAwIGJlbmVmaWNpYXJpZXMgcGVyIGxvY2F0aW9uczsgYW5kIGEgc2xpZ2h0IG1ham9yaXR5IG9mIGxvY2F0aW9ucyB3aXRoIHR3byBwYXJ0bmVycyBoYXZlIG1vcmUgdGhhbiAxLDAwMCBiZW5lZmljaWFyaWVzLg0KDQpgYGB7ciBoaXN0b2dyYW0tbG9jYXRpb25zLWJ5LXBhcnRuZXJ9DQoNCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCkgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgYXJyYW5nZShkZXNjKHBhcnRuZXJzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSkgKw0KICBzY2FsZV94X2xvZzEwKCkgKw0KICBmYWNldF93cmFwKH4gcGFydG5lcnMpICsNCiAgbGFicyh5ID0gIm51bWJlciBvZiBsb2NhdGlvbnMiLA0KICAgICAgIHggPSAiYmVuZWZpY2lhcmllcyBwZXIgbG9jYXRpb24iLCANCiAgICAgICB0aXRsZSA9ICJIaXN0b2dyYW1zIG9mIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgbnVtYmVyIG9mIHBhcnRuZXJzIHBlciBsb2NhdGlvbiIpDQoNCmBgYA0KDQo8YnI+DQoNClRoZSBtb3JlIHBhcnRuZXJzIG9wZXJhdGluZyBpbiBhIGdpdmVuIGxvY2F0aW9uLCB0aGUgaGlnaGVyIHRoZSBhdmVyYWdlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzOyBob3dldmVyLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGVzZSBtdWx0aS1wYXJ0bmVyIGxvY2F0aW9ucyBhcmUgY29tcGFyYXRpdmVseSByYXJlLiBUaGUgbG9jYXRpb24gd2l0aCBmb3VyIHBhcnRuZXJzIGlzIE5hbSBIbGFpbmcgaW4gQmhhbW8sIEthY2hpbi4NCg0KYGBge3IgdGFibGUtbG9jYXRpb25zLXBhcnRuZXJzfQ0KYmVuICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwKSAlPiUgIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICBudW1iZXJfb2ZfcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZ3JvdXBfYnkobnVtYmVyX29mX3BhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBzdW0obl9kaXN0aW5jdChsb2NhdGlvbikpLA0KICAgICAgICAgICAgYXZnX2JlbmVmaWNpYXJpZXMgPSBtZWRpYW4oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUobnVtYmVyX29mX3BhcnRuZXJzID0gcmVjb2RlKG51bWJlcl9vZl9wYXJ0bmVycywgYDFgID0gIm9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAidHdvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJ0aHJlZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiZm91ciIpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQXZlcmFnZSBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9ucyB3aXRoIG9uZSwgdHdvLCB0aHJlZSBhbmQgZm91ciBwYXJ0bmVycyIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAibGVmdCIpDQogIyBwYW5kZXIoY2FwdGlvbiA9ICJBdmVyYWdlIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb25zIHdpdGggb25lLCB0d28sIHRocmVlIGFuZCBmb3VyIHBhcnRuZXJzIikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBBY3Rpdml0aWVzIGFuZCBtb2RhbGl0aWVzDQoNCiMjIyAyLjEgTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eQ0KDQpgYGB7ciBsaW5lLXBsb3QtZmFjZXQtYWN0aXZpdHl9DQpiZW4gJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGFjdGl2aXR5KSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuNykgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgKyAjIHNlZSBpZiB0aGlzIHdvcmtzIHdoZW4geW91IGtuaXQsIHRoZW4gZG8gaXQgZm9yIHRoZSBvdGhlciBwbG90cyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAyMDIxIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KDQpgYGANCg0KUGFydG5lcnMgcmVwb3J0ZWQgdGhlaXIgYWNoaWV2ZW1lbnRzIGFjcm9zcyB0aGUgZWlnaHQgNVcgYWN0aXZpdGllcy4gV2Ugc2VlIHRoYXQgdGhlIG1ham9yaXR5IG9mIHRoZSBjYXNlbG9hZCBmb3IgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyB3YXMgZXN0YWJsaXNoZWQgcHJpb3IgdG8gMjAyMSAod2l0aCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgb25seSBpbmNyZWFzaW5nIHZlcnkgaW5jcmVtZW50YWxseSBhY3Jvc3MgdGhlIGNvdXJzZSBvZiB0aGUgeWVhcikgLS0gdGhpcyBhbGlnbnMgd2l0aCBvdXIgdW5kZXJzdGFuZGluZyB0aGF0IG1hbnkgb2YgdGhlIHByb2plY3RzIGNvbnRyaWJ1dGluZyB0byB0aGlzIGFjdGl2aXR5IHdlcmUgbXVsdGkteWVhciBpbiBuYXR1cmUgYW5kIGhhZCBiZWVuIG9uZ29pbmcgcHJpb3IgdG8gdGhlIEhSUDsgdGhpcyBwYXR0ZXJuIGlzIGFsc28gYXBwYXJlbnQgaW4gdGhlIHByb3Zpc2lvbiBvZiB0ZWNobmljYWwgdHJhaW5pbmcuDQoNCk9uZSBvZiB0aGUgZGlmZmljdWx0aWVzIG9mIGludGVycHJldGluZyB0aGVzZSBkYXRhIGlzIHRoYXQgaXQgaXMgbm90IGFsd2F5cyBhcHBhcmVudCB3aGVyZSB0aGUgcGF0dGVybnMgb2JzZXJ2ZWQgYXJlIHJlZmxlY3RpdmUgb3IgY2hhbmdlcyBpbiB0aGUgZmllbGQgKHN1Y2ggYXMgY2hhbmdlcyBpbiBhY2Nlc3MsIGZ1bmRpbmcgb3Igc3RhZmZpbmcpIG9yIGlmIHRoZXkgYXJlIGluc3RlYWQgZHVlIHRvIHBhcnRuZXJzJyByZXBvcnRpbmcgYmVoYXZpb3Vycy4gV2Ugbm90ZSwgZm9yIGluc3RhbmNlLCBhIGxhcmdlIGp1bXAgaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGZvciBmaXNoZXJ5IGtpdHMgYW5kIGZvb2QgYmFza2V0cyBhcm91bmQgSnVseSAyMDIxIC0tIHRoaXMgd2FzIGR1ZSB0byB0aGUgbmV3bHktYXBwcm92ZWQgYWRkZW5kdW0gdG8gdGhlIEhSUC4gSG93ZXZlciwgc29tZSBvZiB0aGUgb3RoZXIgY2hhbmdlcyBhcmUgbGVzcyBjbGVhciBhbmQgd2lsbCByZXF1aXJlIGNhcmVmdWwgZXhwbG9yYXRpb24gd2l0aCBwYXJ0bmVycy4NCg0KPGJyPg0KDQojIyMgMi4yIERlbGl2ZXJ5IG1vZGFsaWx0aWVzDQoNCkNhc2ggYW5kIGluLWtpbmQgZGlzdHJpYnV0aW9ucyB3ZXJlIGVhY2ggdGhlIG1haW4gZGVsaXZlcnkgbW9kYWxpdHkgaW4gdGhyZWUgYWN0aXZpdGllcywgd2l0aCB0aGUgcHJvdmlzaW9uIG9mIHNlcnZpY2VzIGFuZCBzdXBwb3J0IGJlaW5nIHByZWRvbWluYW50IGluIHR3by4gVGhlIGluLWtpbmQgbW9kYWxpdHkgaGFzIHRoZSBoaWdoZXN0IHJlYWNoLCBnaXZlbiB0aGUgZXNwZWNpYWxseSBsYXJnZSBiZW5lZmljaWFyeSBudW1iZXJzIG9yaWdpbmF0aW5nIGZyb20gdGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGZvb2QgYmFza2V0cy4gV2UgYWxzbyBub3RlIHNldmVyYWwgbWlzY2xhc3NpZmljYXRpb25zIC0tIHNtYWxsIHBvcnRpb25zIG9mIG1vbnRobHkgY2FzaCB0cmFuc2ZlcnMgaGF2ZSBiZWVuIGNvZGVkIGFzICJpbi1raW5kIiBhbmQgdGhlcmUgYXJlIGluLWtpbmQgZm9vZCBiYXNrZXRzIGNvZGVkIGFzICJjYXNoIiBhbmQgImh5YnJpZCIuIEl0IG1pZ2h0IGFsc28gYmUgd29ydGggbW9yZSBjbGVhcmx5IGRlbGluZWF0aW5nIGJldHdlZW4gInN1cHBvcnQgZm9yIGluY29tZS1nZW5lcmF0aW5nIGFjdGl2aXRpZXMiIGFuZCB0aGUgInByb3Zpc2lvbiBvZiB0ZWNobmljYWwgdHJhaW5pbmciIGFzIHNlcnZpY2UgZGVsaXZlcnkgYW5kIHN1cHBvcnQgYXJlIGhlYXZpbHkgcHJlc2VudCBpbiBib3RoLg0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtZmFjZXQtYWN0aXZpdHktbW9kYWxpdHl9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShkZWxpdmVyeV9tb2RhbGl0eSwgYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSByZWNvZGUoZGVsaXZlcnlfbW9kYWxpdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiA9ICJIeWJyaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgZGVsaXZlcnkvc3VwcG9ydCIgPSAiU2VydmljZXMvc3VwcG9ydCIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRlbGl2ZXJ5X21vZGFsaXR5LCB5ID0gYmVuZWZpY2lhcmllcywgZmlsbCA9IGFjdGl2aXR5KSkgKw0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHRpdGxlID0gIkRlbGl2ZXJ5IG1vZGFsaXR5IGJ5IGFjdGl2aXR5LCAyMDIxIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGFyZSBpbiBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0MCwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC41KSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHksIHNjYWxlcyA9ICJmcmVlX3kiKQ0KDQpgYGANCg0KPGJyPg0KDQpgciByb3VuZChmaWx0ZXIoZnNjLCBkZWxpdmVyeV9tb2RhbGl0eSA9PSAiSW4ta2luZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9IC8gc3VtKGZzYyRiZW5lZmljaWFyaWVzKSAqIDEwMClgJSBvZiBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyByZWNlaXZlZCBzdXBwb3J0IHRocm91Z2ggdGhlIGluLWtpbmQgZGVsaXZlcnkgbW9kYWxpdHk7IHdlIHVzZSBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyBoZXJlIGFzIHRoZXJlIHdlcmUgc2V2ZXJhbCBpbnN0YW5jZXMgb2YgbW9kYWxpdGllcyBjaGFuZ2luZyBwYXJ0d2F5IHRocm91Z2ggYW4gaW50ZXJ2ZW50aW9uOiBmb3IgcmVmZXJlbmNlLCBgciByb3VuZChmaWx0ZXIoZnNjLCBkZWxpdmVyeV9tb2RhbGl0eSA9PSAiSW4ta2luZCIpICU+JSB7c3VtKC4kdV9iZW4sIG5hLnJtID0gVFJVRSl9IC8gc3VtKGZzYyR1X2JlbiwgbmEucm0gPSBUUlVFKSAqIDEwMClgJSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbml0aWFsbHkgd2l0aCBpbi1raW5kIGludGVydmVudGlvbnMsIG1lYW5pbmcgdGhhdCB0aGVyZSB3YXMgYSB0ZW5kZW5jeSB0byBkaXZlcnNpZnkgYXdheSBmcm9tIGluLWtpbmQgc3VwcG9ydCBvdmVyIDIwMjEuIGByIHJvdW5kKGZpbHRlcihmc2MsIGRlbGl2ZXJ5X21vZGFsaXR5ID09ICJDYXNoIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJGJlbmVmaWNpYXJpZXMpICogMTAwKWAlIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHdlcmUgcmVhY2hlZCBieSBjYXNoIHRyYW5zZmVycy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1tb2RhbGl0eS1mcmVxdWVuY3l9DQoNCiMgY2hhbmdlZCB0byBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyBpbnN0ZWFkIG9mIHVuaXF1ZSBiZW5lZmljaWFyaWVzIA0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgZ3JvdXBfYnkoZGVsaXZlcnlfbW9kYWxpdHksIGZyZXF1ZW5jeSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGZyZXF1ZW5jeSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3RvdGFscygiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShgJVRvdGFsYCA9IHJvdW5kKFRvdGFsIC8gc3VtKFRvdGFsKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKFRvdGFsKSkgJT4lIA0KICBhZG9ybl90b3RhbHMoInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGJ5IGRlbGl2ZXJ5IG1vZGFsaXRpZXMgYW5kIGZyZXF1ZW5jeSBvZiBkaXN0cmlidXRpb24iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpIA0KICAjIHBhbmRlcihjYXB0aW9uID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGJ5IGRlbGl2ZXJ5IG1vZGFsaXRpZXMgYW5kIGZyZXF1ZW5jeSBvZiBkaXN0cmlidXRpb24iKQ0KDQpgYGANCg0KPGJyPg0KDQpSZWdhcmRpbmcgdGhlIHRhYmxlIGFib3ZlLCB0aGVyZSBpcyBhIHN0cm9uZyBhcmd1bWVudCB0byByZW1vdmUgdGhlIG9wdGlvbiAib3RoZXIiIGZyb20gdGhlIDVXIGNvbHVtbiBgZnJlcXVlbmN5YCAocmVmZXJyaW5nIHRvIGZyZXF1ZW5jeSBvZiB0cmFuc2Zlci9kZWxpdmVyeSkgLS0gd2hhdCBleGFjdGx5IGl0IGNvbm5vdGVzIGlzIHVuY2xlYXIsIGFzIHBhcnRuZXJzIG1pZ2h0IGVsZWN0IHRoaXMgb3B0aW9uIGZvciBhY3Rpdml0aWVzIHRoYXQgb2NjdXIgYm90aCBtb3JlIGFuZCBsZXNzIGZyZXF1ZW50bHkgdGhhbiBldmVyeSBtb250aDsgdGhlcmUgaXMgYWxzbyB0aGUgcG9zc2liaWxpdHkgdGhhdCBwYXJ0bmVycyBhcmUganVzdCBlbGVjdGluZyAib3RoZXIiIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgY29sdW1uIGJsYW5rLiBJdCBpcyBwb3NzaWJsZSB0byBiYWNrZmlsbCBzb21lIG9mIHRoZSAib3RoZXIiIHZhbHVlcyBmcm9tIHRoZSBgYmVuZWZpY2lhcnlfcmVjdXJyZW5jeWAgY29sdW1uLiBUaGlzIHdpbGwgYmUgZXhwbG9yZWQgZnVydGhlciBpbiB0aGUgY2hhcHRlciBvbiBiZW5lZmljaWFyaWVzLiANCg0KVGhlcmUgaXMgYWxzbyBqdXN0aWZpY2F0aW9uIHRvIGRyb3AgdGhlICJGaXJzdCIgY2F0ZWdvcnkgYXMgaXQgZG9lcyBub3QgcmVhbGx5IGhhdmUgbXVjaCByZWxhdGlvbiB0byB0aGUgIk1vbnRobHkiIGNhdGVnb3J5LCBpLmUuIGFuIGluY3JlYXNlIGluIGJlbmVmaWNpYXJpZXMgcmVwb3J0ZWQgYXMgIkZpcnN0IiBkbyBub3QgY29ycmVzcG9uZCB0byBhbiBpbmNyZWFzZSBpbiAiTW9udGhseSIgYmVuZWZpY2lhcmllcyBpbiB0aGUgZm9sbG93aW5nIG1vbnRocywgbWVhbmluZyB0aGF0IHRoZXNlIGJlbmVmaWNpYXJpZXMgc2hvdWxkIGZhbGwgdW5kZXIgdGhlICJPbmUtb2ZmIiBjYXRlZ29yeS4gDQoNCkEga2V5IHBpZWNlIG9mIG1pc3NpbmcgaW5mb3JtYXRpb24gbm90IGN1cnJlbnRseSBjYXB0dXJlZCBieSB0aGUgNVcgdGVtcGxhdGUgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZXNlIGFjdGl2aXRpZXMgLS0gdGhlIG51bWJlciBvZiBtb250aHMgYSBtb250aGx5IGZvb2QgYmFza2V0IGlzIHByb3ZpZGVkIGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgc29tZXdoYXQgcmVsaWFibHkgd2l0aCBjb25zaWRlcmFibGUgZWZmb3J0LiBUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIGF2ZXJhZ2UgZHVyYXRpb24gKGluIG1vbnRocykgb2YgdGhlIHZhcmlvdXMgYWN0aXZpdGllcyBpbiB0aGUgYGZyZXF1ZW5jeWAgY2F0ZWdvcnkgIk1vbnRobHkiOg0KDQpgYGB7ciB0YWJsZS1hdmctZHVyYXRpb24tYWN0aXZpdGllc30NCmZzYyAlPiUgIA0KICBmaWx0ZXIoZnJlcXVlbmN5ID09ICJNb250aGx5IikgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSwgdG93bnNoaXAsIGxvY2F0aW9uKSAlPiUNCiAgc3VtbWFyaXNlKHJlY3VycmVuY2VzID0gbl9kaXN0aW5jdChkYXRlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIHN1bW1hcmlzZShhdmdfZHVyYXRpb25fbW9udGhzID0gcm91bmQobWVhbihyZWN1cnJlbmNlcyksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhhdmdfZHVyYXRpb25fbW9udGhzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkF2ZXJhZ2UgZHVyYXRpb24gKGluIG1vbnRocykgb2YgbW9udGhseSBhY3Rpdml0aWVzIikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCiAgIyBwYW5kZXIoY2FwdGlvbiA9ICJBdmVyYWdlIGR1cmF0aW9uIChpbiBtb250aHMpIG9mIG1vbnRobHkgYWN0aXZpdGllcyIpDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAyLjMgTW9uZXRhcnkgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBwZXIgaG91c2Vob2xkDQoNCjxicj4NCg0KYGBge3IgcGxvdC11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lDQogIGdyb3VwX2J5KHVzZF9oaGRfYmluKSAlPiUgIA0KICBzdW1tYXJpc2UoaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lDQogIG11dGF0ZShgJV9vZl9ob3VzZWhvbGRzYCA9IHJvdW5kKGhvdXNlaG9sZHMgLyBzdW0oaG91c2Vob2xkcykqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdXNkX2hoZF9iaW4sIHkgPSBob3VzZWhvbGRzLCBmaWxsID0gdXNkX2hoZF9iaW4pKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYCVfb2ZfaG91c2Vob2xkc2ApLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiR3JlZW5zIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IHNlcSgwLCAzMDAwMCwgYnkgPSA1MDAwKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh4ID0gIlVTRCB2YWx1ZSBvZiBjYXNoIHRyYW5zZmVyIHBlciBob3VzZWhvbGQiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGhvdXNlaG9sZHMiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBhbmQgcGVyY2VudGFnZSBvZiBob3VzZWhvbGRzIGJ5IHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIpDQpgYGANCg0KPGJyPg0KDQpUaGUgbW9zdCBjb21tb24gdHJhbnNmZXIgdmFsdWVzIC0tIGluIHRlcm1zIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCAtLSBhcmUgYmV0d2VlbiBVU0QgMTAgYW5kIFVTRCAyMCwgdGhvdWdoIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGEgbm90IGluc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGhvdXNlaG9sZHMgKGFib3V0IDclKSB3ZXJlIHJlYWNoZWQgYnkgY2FzaCB0cmFuc2ZlciBpbnRlcnZlbnRpb25zIHZhbHVlZCBhdCBVU0QgMTAwIHBlciBob3VzZWhvbGQgb3IgbW9yZS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBtb25ldGFyeSB2YWx1ZXMgd2VyZSBjYWxjdWxhdGVkIG9ubHkgZnJvbSByb3dzIHdpdGggdW5pcXVlIGJlbmVmaWNpYXJpZXMgYW5kIHRoYXQgd2UgYXJlIG5vdCB1c2luZyB0aGUgY3VtdWxhdGl2ZSBzdW1zIHBlciBob3VzZWhvbGQuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtdXNkLWhoZC1iaW4tZnJlcXVlbmN5fQ0KY2FzaF9kZWxpdmVyeV9tZWNoYW5pc20gPC0gZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEodXNkX2hoZF9iaW4pICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIgJiAhaXMubmEoY2FzaF9kZWxpdmVyeV9tZWNoYW5pc20pICkgJT4lIA0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lIA0KICBtdXRhdGUoaG91c2Vob2xkcyA9IHJvdW5kKGhvdXNlaG9sZHMpKSAlPiUgDQogIGNvdW50KHVzZF9oaGRfYmluLGNhc2hfZGVsaXZlcnlfbWVjaGFuaXNtLCB3dCA9IGhvdXNlaG9sZHMpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdXNkX2hoZF9iaW4sIHZhbHVlc19mcm9tID0gbikgJT4lIA0KICBhZG9ybl90b3RhbHMoImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICByZW5hbWUodG90YWxfaGhkID0gVG90YWwpICU+JSANCiAgbXV0YXRlKHBjX29mX2hoZCA9IHJvdW5kKHRvdGFsX2hoZCAvIHN1bSh0b3RhbF9oaGQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfaGhkKSkgDQoNCmNhc2hfZGVsaXZlcnlfbWVjaGFuaXNtICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJDYXNoIHRyYW5zZmVyLCBoeWJyaWQgYW5kIHZvdWNoZXIgdmFsdWVzIHBlciBob3VzZWhvbGQgYnkgY2FzaCBkZWxpdmVyeSBtZWNoYW5pc20gKFVTRCkiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSAic3RyaXBlZCIpDQoNCg0KYGBgDQoNCjxicj4NCg0KYnkgZmFyIHRoZSBtb3N0IGNvbW1vbiBjYXNoIGRlbGl2ZXJ5IG1lY2hhbmlzbSB3YXMgZGlyZWN0IGNhc2ggcGF5bWVudHMgLS0gYHIgZmlsdGVyKGNhc2hfZGVsaXZlcnlfbWVjaGFuaXNtLCBjYXNoX2RlbGl2ZXJ5X21lY2hhbmlzbSA9PSAiRGlyZWN0IGNhc2ggcGF5bWVudCIpICU+JSAgcHVsbChwY19vZl9oaGQpYCUgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgdGhyb3VnaCB0aGlzIG1lY2hhbmlzbS4gVHJhbnNmZXJzIG1hZGUgdGhyb3VnaCBNb25leSB0cmFuc2ZlciBhZ2VudHMgaGFkIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgdHJhbnNmZXIgYW1vdW50LiANCg0KDQpOZXh0LCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIGJ5IGFjdGl2aXR5IHR5cGU6DQoNCmBgYHtyIHRhYmxlLXVzZC12YWx1ZXMtYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGhvdXNlaG9sZHMgPSByb3VuZChzdW0oaG91c2Vob2xkcywgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICB0b3RhbF92YWx1ZV91c2QgPSByb3VuZChzdW0odG90YWxfdmFsdWVfdXNkLCBuYS5ybSA9IFRSVUUpKSkgJT4lIA0KICBtdXRhdGUoYXZnX3RyYW5zZmVyX3ZhbHVlID0gcm91bmQodG90YWxfdmFsdWVfdXNkIC8gaG91c2Vob2xkcywgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGF2Z190cmFuc2Zlcl92YWx1ZSkpICU+JSAgDQogIGthYmxlKGNhcHRpb24gPSAiQXZlcmFnZSB2YWx1ZSAoVVNEKSBvZiBob3VzZWhvbGQgcGFja2FnZSB2YWx1ZXMgcGVyIGFjdGl2aXR5IiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGxpZ2h0YWJsZV9vcHRpb25zID0gInN0cmlwZWQiKQ0KICANCmBgYA0KDQo8YnI+DQoNCk92ZXJhbGwsIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgY2FzaCB0cmFuc2ZlcnMgd2VyZSBmcm9tIHRoZSBwcm92aXNpb24gb2YgbGl2ZXN0b2NrIGtpdHMgYW5kIHRoZSBsb3dlc3QgYXZlcmFnZXMgZnJvbSBmaXNoZXJ5IGtpdHMgKGFmdGVyIGRpc2NvdW50aW5nIGZvb2QgYmFza2V0cywgd2hlcmUgbGVzcyB0aGFuIDElIG9mIGFjdGl2aXRpZXMgcmVwb3J0ZWQgdGhlIHBhY2thZ2UgdmFsdWUpLiBJdCBpcyBhbHNvIHVuY2xlYXIgaWYgZmlzaGVyeSBraXRzIGFuZCB0ZWNobmljYWwgdHJhaW5pbmcgdGVuZGVkIHRvIGhhdmUgcGFydGljdWxhcmx5IHNtYWxsIGNhc2ggY29tcG9uZW50cyBvciBpZiB0aGVyZSB3ZXJlIGRhdGEgZW50cnkgZXJyb3JzLiBCdXQgdGhlIGF2ZXJhZ2UgcGFja2FnZSB2YWx1ZXMgYXJlIG9ubHkgcGFydCBvZiB0aGUgcGljdHVyZSBhbmQgc2lnbmlmaWNhbnQgdmFyaWF0aW9uIGluIHRyYW5zZmVyIHZhbHVlcyBleGlzdHMgd2l0aGluIGVhY2ggYWN0aXZpdHk6DQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mYWNldC11c2QtaGhkLWJpbi1hY3Rpdml0eX0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEodXNkX2hoZF9iaW4pICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ2FzaCIsICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIsICJWb3VjaGVyIikpICU+JQ0KICBncm91cF9ieShhY3Rpdml0eSwgdXNkX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdXNkX2hoZF9iaW4sIHkgPSBob3VzZWhvbGRzLCBmaWxsID0gYWN0aXZpdHkpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh4ID0gIiIpICsNCiAgbGFicyh0aXRsZSA9ICJWYXJpYXRpb24gaW4gdGhlICBwZXIgaG91c2Vob2xkIHZhbHVlcyBvZiBpbnRlcnZlbnRpb24gcGFja2FnZXMgaW4gVVNEIiwgDQogICAgICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBhY3Rpdml0eTsgY29udGFpbnMgb25seSBkYXRhIGZyb20gYWN0aXZpdGllcyB1c2luZyBjYXNoLCBoeWJyaWQgb3Igdm91Y2hlciBtb2RhbGl0aWVzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHksIHNjYWxlcyA9ICJmcmVlX3kiKQ0KDQpgYGANCg0KPGJyPg0KIA0KSXQgd291bGQgYmUgZnJ1aXRmdWwgdG8gZXhwbG9yZSB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgaW4gbW9yZSBkZXRhaWwgLS0gdGhpcyBhY3Rpdml0eSBoYXMgYSB2ZXJ5IGNsZWFyIHBlYWsgYXQgYD49JDEwXzwkMjBgLiBBIGNsb3NlciBsb29rIHJldmVhbHMgdGhhdCB0aGlzIGlzIGFsbW9zdCBlbnRpcmVseSBkdWUgdG8gdGhlIGByIGZzYyAlPiUgZmlsdGVyKHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID09IDEwLjUgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIHtzdW0oLiRob3VzZWhvbGRzKX0gJT4lIHJvdW5kKCkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgd2hvIHJlY2VpdmVkIG1vbnRobHkgdHJhbnNmZXJzIG9mIFVTRCAxMC41MC9tb250aCAob3IgTU1LIDE1LDAwMCkgcGVyIGhvdXNlaG9sZC4gSXQgaXMgdW5jbGVhciB3aGV0aGVyIHRoaXMgaXMgYSBkYXRhIGVudHJ5IGVycm9yIC0tIGJ1dCB3aGF0IHdlIGRvIGtub3cgaXMgdGhhdCB0aGUgaG91c2Vob2xkcyB0aGF0IHJlY2VpdmVkIHRoaXMgdHlwZSBvZiB0cmFuc2ZlciB3ZXJlIG5vdCBzbWFsbGVyIHRoYW4gYXZlcmFnZTsgaXQgbWlnaHQgYWxzbyBiZSBwb3NzaWJsZSB0aGF0IHRoaXMgYWN0aXZpdHkgaGFkIGJlZW4gY29uY2VpdmVkIGFzIG9uZSBzaW5ndWxhciB0cmFuc2ZlciB0aGF0IGhhZCBiZWVuIHNwbGl0IGFjcm9zcyBzZXZlcmFsIG1vbnRocy4NCg0KVGhpcyBzaG91bGQgYmUgZm9sbG93ZWQgdXAgd2l0aCB0aGUgNyBwYXJ0bmVycyB3aG8gcHJvdmlkZWQgdGhpcyB0cmFuc2ZlciB2YWx1ZSB0byBiZW5lZmljaWFyeSBob3VzZWhvbGRzOyB0aGV5IGFyZTogV0ZQLCBQbGFuIEludGVybmF0aW9uYWwsIFNhdmUgdGhlIENoaWxkcmVuLCBNeWFubWFyIEhlYXJ0IERldmVsb3BtZW50IE9yZ2FuaXNhdGlvbiwgUGVvcGxlIGZvciBQZW9wbGUsIFdvcmxkIFZpc2lvbiBNeWFubWFyIGFuZCBQZW9wbGUgaW4gTmVlZC4NCg0KVGhpcyBhbW91bnQgZmFsbHMgZmFyIGJlbG93IHRoZSBtaW5pbXVtIGV4cGVuZGl0dXJlIGJhc2tldCBmb3IgZm9vZCBpZGVudGlmaWVkIGJ5IHRoZSBDYXNoIFdvcmtpbmcgR3JvdXAsIHdoaWNoIGVzdGFibGlzaGVkIGEgZmxvb3Igb2YgTU1LIDE5MCw1NTUgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGguIEJlbG93IGlzIGEgdGFibGUgd2hpY2ggc3VtbWFyaXNlcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2Qgd2hpY2ggaXMgY292ZXJlZCBieSB0aGUgZGlmZmVyZW50IGJpbnMgd2UgaGF2ZSBlc3RhYmxpc2hlZCBmb3IgdGhlIGNhc2gtdHJhbnNmZXIgdmFsdWVzOg0KDQpgYGB7ciB0YWJsZS1tZWItdXNkLWhoZC1iaW59DQoNCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmIGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiKSAlPiUgDQogIGZpbHRlcighaXMubmEodmFsdWVfcGVyX2hvdXNlaG9sZCkpICU+JSANCiAgbXV0YXRlKHBjX21lYiA9IHZhbHVlX3Blcl9ob3VzZWhvbGQgLyAxOTA1NTUpICU+JSANCiAgZ3JvdXBfYnkodXNkX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGF2Z19wY19vZl9tZWIgPSByb3VuZChtZWFuKHBjX21lYikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYXZnX3VzZF9tb250aCA9IHJvdW5kKG1lYW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgaG91c2Vob2xkcyA9IHJvdW5kKHN1bShob3VzZWhvbGRzKSkpICU+JSANCiAgbXV0YXRlKHBjX29mX2hoZCA9IHJvdW5kKGhvdXNlaG9sZHMgLyBzdW0oaG91c2Vob2xkcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVyIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSANCg0KYGBgDQoNCjxicj4NCg0KQXJvdW5kIDEwLjUlIG9mIGJlbmVmaWNpYXJpZXMgb2YgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyBoYXZlIHJlY2VpdmVkIG1vcmUgdGhhbiA1MCUgb2YgdGhlIHZhbHVlIG9mIHRoZSBtaW5pbXVtIGV4cGVuZGl0dXJlIGJhc2tldCBmb3IgZm9vZC4gTm90YWJseSwgMTMlIG9mIGJlbmVmaWNpYXJ5IGhvdXNlaG9sZHMgaGF2ZSByZWNlaXZlZCBsZXNzIHRoYW4gVVNEIDEwIHBlciBob3VzZWhvbGQgcGVyIG1vbnRoLiBUaGlzIHVuZGVyc2NvcmVzIHRoZSBpbXBvcnRhbmNlIG9mIHN0YW5kYXJkaXNhdGlvbjogYmVuZWZpY2lhcmllcyBoYXZlIGFscmVhZHkgcmVjZWl2ZWQgdmVyeSBkaWZmZXJlbnQgcGFja2FnZSBhbW91bnRzIGFuZCB0aGVyZSBpcyBhIHByZXNzaW5nIG5lZWQgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBvbiB3aGV0aGVyIGNhc2ggdHJhbnNmZXJzIChhbmQgZm9vZCBiYXNrZXRzKSBoYXZlIGJlZW4gZGVzaWduZWQgdG8gYmUgZnVsbCByYXRpb25zLCBoYWxmIHJhdGlvbnMgb3IgYXJlIGluc3RlYWQgaW50ZW5kZWQgdG8gYmUgc3VwcGxlbWVudGFyeSBhY3Rpdml0aWVzLiBUaGlzIGlzIGtleSBmcm9tIGEgY29vcmRpbmF0aW9uIHN0YW5kcG9pbnQgYXMgd2UgY2Fubm90IGNvbnNpZGVyIHRoZSBmb29kIHNlY3VyaXR5IG5lZWRzIG9mIHRob3NlIHdobyBoYXZlIG9ubHkgcmVjZWl2ZWQgc3VwcGxlbWVudGFyeSB0cmFuc2ZlcnMgdG8gaGF2ZSBiZWVuIGNvdmVyZWQuDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuIFBhcnRuZXJzDQoNCk9mIHRoZSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgb2YgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgYSB0b3RhbCBvZiBgciBmc2MgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIG9mIHRoZW0gY2xhc3NpZmllZCB0aGVtc2VsdmVzIGFzIGltcGxlbWVudGluZyBwYXJ0bmVycyB3aXRoaW4gdGhlIDVXcy4gVGhleSBhcmUgZmFpcmx5IGV2ZW5seSBzcGxpdCB0aGVtc2VsdmVzIGJldHdlZW4gSFJQIGluZGljYXRvcnMsIHdpdGggYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMS4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGZvb2QgYW5kIGNhc2ggYXNzaXN0YW5jZSBhbmQgYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMi4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQuIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBmaWx0ZXIoYmVuZWZpY2lhcmllcyA8IDEwMDAwKSAlPiUgbnJvdygpYCBwYXJ0bmVycyBoYXZlIHJlYWNoZWQgbGVzcyB0aGFuIDEwLDAwMCB1bmlxdWUgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG1lZGlhbiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHBhcnRuZXJzIGlzIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSB7bWVkaWFuKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYC4gQmVsb3cgYXJlIHRoZSB0b3AgMTAgcGFydG5lcnMgYnkgSFJQIGluZGljYXRvci4gQXMgYSBzaWRlIG5vdGUsIFppZ3dheSBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBhIHZlbmRvci9zdXBwbGllciBvZiBXRlAsIGFuZCBub3QgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIC0tIHNvbWUgZm9sbG93IHVwIHdpdGggV0ZQIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHJlY3RpZnkgdGhpcy4NCg0KYGBge3IgdGFibGUtdG9wLXBhcnRuZXJzLWJ5LWhycC1pbmRpY2F0b3J9DQoNCiMgcmVtaW5kZXIgdG8gcmVkbyB0aGUgbnVtYmVycyB3aGVuIHlvdSByZXJ1biB0aGlzIHdpdGggZnJlc2ggZGF0YSANCg0KY2JpbmQoDQogIA0KICBmc2MgJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIxLk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgJg0KICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXNfcmVjdXJyZW5jeSAlaW4lIGMoIkZpcnN0IiwgIk9uZS1vZmYiKSkgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgcmVuYW1lKGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgYFBhcnRuZXJzIEhSUCBpbmRpY2F0b3IxYCA9IGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIGhlYWQoMTApLA0KICANCiAgZnNjICU+JSANCiAgICBmaWx0ZXIoaHJwX2luZGljYXRvciA9PSAiMi5OdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IiAmDQogICAgICAgICAgICAgYmVuZWZpY2lhcmllc19yZWN1cnJlbmN5ICVpbiUgYygiRmlyc3QiLCAiT25lLW9mZiIpKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDIuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnRgID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgYFBhcnRuZXJzIEhSUCBpbmRpY2F0b3IyYCA9IGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIGhlYWQoMTApDQogIA0KKSAlPiUgDQogIGFkZF9jb2x1bW4oYCBgID0gIiAiKSAlPiUgDQogIHJlbG9jYXRlKGAgYCwgLmFmdGVyID0gYDEuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZWApICU+JSANCiAgDQogIGthYmxlKGNhcHRpb24gPSAiVG9wIDEwIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYnkgSFJQIGluZGljYXRvciIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiVG9wIDEwIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYnkgSFJQIGluZGljYXRvciIpDQoNCmBgYA0KDQo8YnI+DQoNCiMjIyAzLjEgRGlzdHJpYnV0aW9uIG9mIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgYW5kIGdlb2dyYXBoaWMgcmVhY2gNCg0KV2hpbHN0IHRoZXJlIGlzIHF1aXRlIGEgYml0IG9mIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgd2UgY2FuIHNlZSB0aGF0IHBhcnRuZXJzJyBnZW9ncmFwaGljIGZvb3RwcmludHMgYXJlIC0tIG9uIHRoZSB3aG9sZSAtLSBxdWl0ZSBsaW1pdGVkLiBPbmx5IGByIGJlbiAlPiUgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiAxMCkgJT4lIG5yb3coKWAgcGFydG5lcnMgaGF2ZSBhIHByZXNlbmNlIGluIG1vcmUgdGhhbiAxMCB0b3duc2hpcHMsIHdpdGggb25seSBgciBiZW4gJT4lIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSBmaWx0ZXIodG93bnNoaXBzID4gNSkgJT4lIG5yb3coKWAgYmVpbmcgcHJlc2VudCBpbiBtb3JlIHRoYW4gNSB0b3duc2hpcHMuIDc4JSBvZiBvdXIgcGFydG5lcnMgKGNsdXN0ZXJlZCBhbG9uZyB0aGUgYm90dG9tIG9mIHRoZSBjaGFydCkgYXJlIHByZXNlbnQgaW4gNSBvciBsZXNzIHRvd25zaGlwcy4gVGhpcyBkaXN0cmlidXRpb24gb2YgcGFydG5lcnMgaXMgYW4gaW1wZWRpbWVudCB0byBhIGNvdW50cnl3aWRlIHJlc3BvbnNlIGFuZCBpdCBpcyBpbXBlcmF0aXZlIHRvIHVuZGVyc3RhbmQgaG93IGJlc3QgdG8gaW5jZW50aXZpc2UgcGFydG5lcnMgdG8gZXhwYW5kIHRoZWlyIGZvb3RwcmludHMuDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LXNjYXR0ZXItcGFydG5lcnMtcmVhY2h9DQojIHJlbWluZGVyIHRvIHJlY2FsY3VsYXRlIHRoZSA3OSUgYWJvdmUgaWYgeW91IHJlcnVuIHRoZSBkYXRhIA0KcGFydG5lcl9zY2F0dGVyIDwtIGJlbiAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICBzdW1tYXJpc2Uoc3RhdGVzID0gbl9kaXN0aW5jdChhZG1pbjFfcGNvZGUpLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2Moc3RhdGVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gdG93bnNoaXBzLCB0ZXh0ID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgKyAgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nIiwgbGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IGMoMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMzAsIDUpKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIiwNCiAgICAgICB0aXRsZSA9ICJQbG90IG9mIGJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkLCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIpIA0KIyBmb3Igc29tZSByZWFzb24sIHJlbW92aW5nIHRoaXMgbWVzc2VzIHdpdGggdGhlIGFsaWdubWVudCBvZiB0aGUgcGxvdA0KDQpnZ3Bsb3RseShwYXJ0bmVyX3NjYXR0ZXIpICU+JQ0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3VwPiIpKSkNCg0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMiBNYXBzIG9mIG51bWJlciBvZiBwYXJ0bmVycyBhbmQgMjAyMiBwZW9wbGUgaW4gbmVlZCBieSBzdGF0ZS9yZWdpb24NCg0KYGBge3IgaGFzLXBhcnRuZXItZGF0YXNldH0NCmhhc19wYXJ0bmVyIDwtIHBpbiAlPiUgc2VsZWN0KHN0YXRlLCBhZG1pbjNfcGNvZGUsIHRvd25zaGlwLCBwaW5fMjAyMikgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSAgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBtdXRhdGUoaGFzX3BhcnRuZXIgPSBpZmVsc2UocGFydG5lcnMgPT0gMCwgRkFMU0UsIFRSVUUpKSAlPiUgDQogIGdyb3VwX2J5KGhhc19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShwaW5fMjAyMiA9IHN1bShwaW5fMjAyMiksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuKCkpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoImNvbCIpICU+JSANCiAgbXV0YXRlKHBpbl8yMDIyID0gcm91bmQocGluXzIwMjIgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgdG93bnNoaXBzID0gcm91bmQodG93bnNoaXBzICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KDQpgYGANCg0KRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGFyZSBub3Qgd2VsbC1wb3NpdGlvbmVkIHRvIG1lZXQgdGhlIG5lZWRzIG9mIHRoZSAyMDIyIHBvcHVsYXRpb24gaW4gbmVlZC4gUGFydG5lcnMgYXJlIGxhcmdlbHkgY29uY2VudHJhdGVkIGluIEthY2hpbiwgUmFraGluZSBhbmQgWWFuZ29uLCB3aXRoIG9ubHkgb25lIHBhcnRuZXIgcHJlc2VudCBpbiBTaGFuIChFYXN0KSBhbmQgdHdvIGluIFRhbmludGhhcnlpLg0KDQpPdmVyYWxsLCBgciByb3VuZChoYXNfcGFydG5lciAlPiUgZmlsdGVyKGhhc19wYXJ0bmVyID09IEZBTFNFKSAlPiUgcHVsbCh0b3duc2hpcHMpKWAlIG9mIHRvd25zaGlwcywgY29udGFpbmluZyBgciByb3VuZChoYXNfcGFydG5lciAlPiUgZmlsdGVyKGhhc19wYXJ0bmVyID09IEZBTFNFKSAlPiUgcHVsbChwaW5fMjAyMikpYCUgb2YgdGhlIDIwMjIgUElOLCBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudC4gVGhpcyBsYWNrIG9mIG5hdGlvbndpZGUgY292ZXJhZ2Ugd2lsbCBiZSBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGNvbnN0cmFpbnRzIHRoYXQgdGhlIEZTQyB3aWxsIGZhY2UgaW4gbWVldGluZyB0aGUgMjAyMiBuZWVkcyBvZiB2dWxuZXJhYmxlLCBmb29kIGluc2VjdXJlIHBlcnNvbnMgYW5kIElEUHMgLS0gYW5kIHJlc29sdmluZyB0aGlzIHdpbGwgbmVjZXNzaXRhdGUgYm90aCBpbmNyZWFzaW5nIHBhcnRuZXIgY292ZXJhZ2UgYW5kIGZpbmRpbmcgbmV3IHBhcnRuZXJzIGZvciB0aGUgY2x1c3Rlci4NCg0KYGBge3IgbWFwLXBhcnRuZXJzLXBpbi10b3duc2hpcCwgZmlnLmhlaWdodD0xMH0NCiMgcGxheSB3aXRoIGdlb21fbGluZSBmb3IgdGhlIGludGVyYWN0aXZlIHJlZmVyZW5jZSBtYXAgLS0gbWF5YmUgeW91IGNhbiBnZXQgdGhlIG91dGxpbmVzIHRvIGJlIGluIGRpZmZlcmVudCBjb2xvdXJzDQoNCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gInJldmVyc2UiLCBicmVha3MgPSBjKDEsIDMsIDUsIDcsIDksMTEpKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpKSArDQogIGxhYnModGl0bGUgPSAiTWFwIG9mIG51bWJlciBvZiBwYXJ0bmVycyBieSB0b3duc2hpcCIpICsNCg0KcGluICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShQSU4gPSBzdW0ocGluXzIwMjIpKSAlPiUgDQogIG11dGF0ZShQSU4gPSByb3VuZChQSU4sIGRpZ2l0cyA9IDApLCANCiAgICAgICAgIFBJTiA9IHJlY29kZShQSU4sIA0KICAgICAgICAgICAgICAgICAgICAgICcwJyA9IE5BX3JlYWxfKSkgJT4lDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBQSU4pLCBzaXplID0gMC4xKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIsIGJyZWFrcyA9IGMoMTAwMDAsIDUwMDAwLCAxMDAwMDAsIDE1MDAwMCwgMTgwMDAwKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpKSArDQogIGxhYnModGl0bGUgPSAiTWFwIG9mIDIwMjIgUElOIGJ5IHRvd25zaGlwIikNCg0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMyBNb250aGx5IHByb2dyZXNzIGJ5IHBhcnRuZXINCg0KYGBge3IgcGFydG5lcnMtcHJvZ3Jlc3Mtb3Zlci10aW1lLWZhY2V0fQ0KcGFydG5lcl90b3AgPC0gYmVuICU+JSAgDQogIHN1bV9iZW4oaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgcHVsbChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBoZWFkKDIwKQ0KDQpiZW4gJT4lIA0KICBmaWx0ZXIoaW1wbGVtZW50aW5nX3BhcnRuZXJzICVpbiUgcGFydG5lcl90b3ApICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lcnMgPSBmY3RfcmVvcmRlcihpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGN1bV9iZW4sIG1heCwgLmRlc2MgPSBUUlVFKSkgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4pKSArDQogIGdlb21fbGluZShzaXplID0gMC42KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMS0wNy0wMSIpKSkgKw0KICBmYWNldF93cmFwKH4gaW1wbGVtZW50aW5nX3BhcnRuZXJzLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzLjUpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNCksDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQuNSwgZmFjZSA9ICJib2xkIikpICsgIyBzZWUgaWYgdGhpcyB3b3JrcyB3aGVuIHlvdSBrbml0LCB0aGVuIGRvIGl0IGZvciB0aGUgb3RoZXIgcGxvdHMgDQogIGxhYnMoeCA9ICJNb250aHMiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1vbnRobHkgcHJvZ3Jlc3Mgb2YgdG9wIDIwIGltcGxlbWVudGluZyBwYXJ0bmVycywgMjAyMSIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSkNCmBgYA0KDQogPGJyPg0KIA0KVGhlIHBsb3QgYWJvdmUgc2hvd3MgdGhlIHRvcCAyMCBwYXJ0bmVycyBieSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjEsIHdpdGggdGhlIHJlZCBsaW5lIGluZGljYXRpbmcgSnVseSAyMDIxLCB3aGVuIHRoZSBIUlAgYWRkZW5kdW0gd2FzIGFwcHJvdmVkIGFuZCBwdWJsaXNoZWQuIFdlIGNhbiBzZWUgdGhhdCBtYW55LCBvbiB0aGUgd2hvbGUsIHRoZSBIUlAgYWRkZW5kdW0gaGFkIGEgdmVyeSBsYXJnZSBlZmZlY3Qgb24gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgLS0gbW9zdCBwYXJ0bmVycyBlbmFjdGVkIGEgc2lnbmlmaWNhbnQgcmFtcCB1cCBhbmQgcmVhY2hlZCB0aGUgbWFqb3JpdHkgb2YgYmVuZWZpY2lhcmllcyBhZnRlciBpdCB3YXMgcHVibGlzaGVkLiBFeGNlcHRpb25zIHRvIHRoaXMgaW5jbHVkZSBvcmdhbmlzYXRpb25zIHN1Y2ggYXMgQ0VTVkksIEhlbGVuIEtlbGxlciBJbnRlcm5hdGlvbmFsLCBTYXZlIHRoZSBDaGlsZHJlbiBhbmQgTXlhbm1hciBIZWFydCBEZXZlbG9wbWVudCBPcmdhbmlzYXRpb24sIHdobyBlc3RhYmxpc2hlZCBtb3N0IG9mIHRoZWlyIGNhc2Vsb2FkIHByaW9yIHRvIEp1bHkgMjAyMS4gIA0KDQo8YnI+PGJyPg0KDQojIyMgMy40IFR5cGVzIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycw0KDQpgYGB7ciB0YWJsZS1pbXBsZW1lbnRpbmctcGFydG5lci10eXBlLCB3YXJuaW5nPUZBTFNFfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX2JlbmVmaWNpYXJpZXMgPSByb3VuZChtZWFuKGJlbmVmaWNpYXJpZXMpKSwNCiAgICAgICAgICAgIGF2Z190b3duc2hpcHMgPSByb3VuZChtZWFuKHRvd25zaGlwcyksIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgIGF2Z19zdGF0ZXMgPSByb3VuZChtZWFuKHN0YXRlcyksIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSAgDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlID0gZmN0X3JlbGV2ZWwoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSwgbGV2ZWxzID0gYygiSU5HTyIsICJOTkdPIiwgIlVOIiwgIm90aGVyIikpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQXZlcmFnZSByZWFjaCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgcmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSIpDQoNCmBgYA0KDQo8YnI+DQoNCklOR09zLCBvbiBhdmVyYWdlLCByZWFjaGVkIG1vcmUgYmVuZWZpY2lhcmllcyBhY3Jvc3MgbW9yZSB0b3duc2hpcHMgdGhhbiBOTkdPcywgcGVyaGFwcyBkdWUgdG8gdGhlIGdlbmVyYWxseSB0aWdodGVyIGZvY3VzIG9mIHNldmVyYWwgY29tbXVuaXR5LWJhc2VkIG9yZ2FuaXNhdGlvbnMuIFRoZXJlIGlzIG9ubHkgb25lIGFnZW5jeSBpbiB0aGUgIlVOIiBjYXRlZ29yeSAtLSBXRlA7IHRoZSAib3RoZXIiIGNhdGVnb3J5IHJlZmVycyB0byB0d28gcHJpdmF0ZSBsaW1pdGVkIGNvbXBhbmllcyB3aGljaCBhbHNvIGltcGxlbWVudGVkIGZvb2Qgc2VjdXJpdHkgYWN0aXZpdGllcy4NCg0KPGJyPjxicj4NCg0KIyMjIDMuNSBSZXBvcnRpbmcgb3JnYW5pc2F0aW9ucw0KDQpUaGVyZSBhcmUgYHIgZnNjICU+JSBkaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBucm93KClgIGNvbWJpbmF0aW9ucyBiZXR3ZWVuIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zIGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lcnMsIGByIGZzYyAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gPT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgbnJvdygpYCBvZiB3aGljaCBhcmUgaW5zdGFuY2VzIHdoZXJlIHRoZSByZXBvcnRpbmcgb3JnYW5pc2F0aW9uIGFuZCB0aGUgaW1wbGVtZW50aW5nIHBhcnRuZXIgYXJlIHRoZSBzYW1lIG9yZ2FuaXNhdGlvbjsgb25jZSB0aGVzZSBhcmUgZmlsdGVyZWQgb3V0LCBhbGwgdGhlIHJlbWFpbmluZyBpbXBsZW1lbnRpbmcgcGFydG5lcnMgY29ycmVzcG9uZCB0byBqdXN0IGByIGZzYyAlPiUgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gIT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIG5yb3coKWAgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnM6DQoNCmBgYHtyIHRhYmxlLXJlcG9ydGluZy1vcmdhbmlzYXRpb259DQpmc2MgJT4lIA0KICBmaWx0ZXIocmVwb3J0aW5nX29yZ2FuaXphdGlvbiAhPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgZ3JvdXBfYnkocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSByZXBvcnRpbmcgb3JnYW5pc2F0aW9uIikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKQ0KDQpgYGANCg0KPGJyPg0KDQpSZWdhcmRpbmcgcXVlc3Rpb25zIG9mIG1lbWJlcnNoaXAsIGl0IHdvdWxkIGJlIHNhZmUgdG8gc2F5IHRoYXQgYWxsIHBhcnRuZXJzIHdobyByZXBvcnRlZCBpbiB0aGUgNVdzIC0tIGJlIHRoZXkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgb3IgaW1wbGVtZW50aW5nIHBhcnRuZXJzIC0tIGluIGFkZGl0aW9uIHRvIHN0cmF0ZWdpYyBwYXJ0bmVycyBhbmQgcGFydG5lcnMgd2hvIGFpZCBpbiBhbmFseXNpcyB3aG8gYXJlIG5vdCByZXByZXNlbnRlZCBpbiB0aGUgNVdzLCBhcmUgRlNDIHBhcnRuZXJzLiBIb3dldmVyLCBmb3IgdGhpcyByZXBvcnQsIHdlIGhhdmUgdXNlZCBgaW1wbGVtZW50aW5nX3BhcnRuZXJzYCBmb3IgbW9zdCBvZiB0aGUgYW5hbHlzaXMgYXMsIGJ5IHRoZWlyIG5hdHVyZSwgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgZG8gbm90IGhhdmUgYSBmaWVsZCBwcmVzZW5jZS4gQXMgYSBzaWRlIG5vdGUsIEZBTyBoYXMgbm90IGNsYXNzaWZpZWQgaXRzZWxmIGFzIGFuIGltcGxlbWVudGluZyBwYXJ0bmVyLCBoYXZpbmcgcmVwb3J0ZWQgbm8gYWN0aXZpdGllcyB0aGF0IHdlcmUgZGlyZWN0bHkgaW1wbGVtZW50ZWQgYnkgdGhlbS4NCg0KPGJyPjxicj4NCg0KDQojIyMgMy42IERvbm9ycw0KDQpgciByb3VuZChzdW0oKCFpcy5uYShmc2MkZG9ub3IpKSkgLyBucm93KGZzYykgKiAxMDAsIGRpZ2l0cyA9IDApYCUgb2YgdGhlIHJvd3MgaGFkIHRoZSBgZG9ub3JgIGNvbHVtbiBmaWxsZWQ7IGhvd2V2ZXIsIHRoaXMgb25seSByZXByZXNlbnRzIGFjdGl2aXRpZXMgcmVhY2hpbmcgMjMlIG9mIGFsbCBiZW5lZmljaWFyaWVzLiBCZWxvdyBpcyBhIHRhYmxlIG9mIHRoZSAxMCBkb25vcnMgKGFmdGVyIG9yZ2FuaXNhdGlvbnMgdXNpbmcgdGhlaXIgb3duIHJlc291cmNlcykgd2hvc2UgZnVuZGluZyAgaGFzIHJlYWNoZWQgdGhlIG1vc3QgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG51bWJlciBvZiB0b3duc2hpcHMgdGhlaXIgZnVuZGluZyBoYXMgYmVlbiB1c2VkIGluOg0KDQpgYGB7ciBkb25vci10YWJsZX0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieShkb25vcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVsb2NhdGUocGNfb2ZfYmVuLCAuYWZ0ZXIgPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGZpbHRlcighaXMubmEoZG9ub3IpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBoZWFkKDExKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG9wIDEwIGRvbm9ycyBieSBudW1iZXIgb2YgYmVuZWZpY2FpcmllcyByZWFjaGVkIHdpdGggdGhlaXIgZnVuZGluZyIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGxpZ2h0YWJsZV9vcHRpb25zID0gYygic3RyaXBlZCIpKQ0KYGBgDQoNCjxicj4NCg0KQWRkaXRpb25hbGx5LCB3ZSBhbHNvIG9ic2VydmUgYSBudW1iZXIgb2YgZXJyb3JzLCBpbmNsdWRpbmcgY2FzZXMgd2hlcmUgbXVsdGlwbGUgZG9ub3JzIGhhdmUgYmVlbiBjb21iaW5lZCBpbnRvIG9uZSByb3cgYXMgd2VsbCBhcyBudW1lcm91cyBpbnN0YW5jZXMgd2hlcmUgVU5EUCwgV0ZQLCBGQU8gYW5kIFVOIFdPTUVOIHdlcmUgY2xhc3NpZmllZCBhcyBkb25vcnMgYXMgb3Bwb3NlZCB0byByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucy4gSGVsdmV0YXMgc2hvdWxkIGFsc28gcHJvYmFibHkgaGF2ZSByZXBvcnRlZCB1bmRlciAib3JnYW5pc2F0aW9ucyB1c2luZyB0aGVpciBvd24gZnVuZHMiLiANCg0KPGJyPjxicj48YnI+DQoNCiMjIDQuIEJlbmVmaWNpYXJpZXMNCg0KIyMjIDQuMSBCZW5lZmljaWFyeSBkaXNhZ2dyZWdhdGlvbnMNCg0KQ3VycmVudGx5LCBpbiB0aGUgNVdzLCB0aGUgdmFzdCBtYWpvcml0eSBvZiBiZW5lZmljaWFyeSBkaWFzYWdncmVnYXRpb25zIGhhdmUgYmVlbiBiYWNrZmlsbGVkIGZyb20gY2Vuc3VzIGRhdGEgYW5kIGRvIG5vdCwgY29uc2VxdWVudGx5LCBwcm92aWRlIGFuIGFjY3VyYXRlIHBpY3R1cmUgb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBoYXZlIGJlZW4gcmVhY2hlZCBieSBGb29kIFNlY3VyaXR5IGludGVydmVudGlvbnMuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaG93IGZhciByZWFsaXR5IGRpdmVyZ2VzIGZyb20gd2hhdCBoYXMgYmVlbiByZXBvcnRlZCBzbyBmYXIgLS0gbWVhbmluZyB0aGF0IHdlIGFsc28gY2Fubm90IGRldGVybWluZSBpZiB0aGVyZSBoYXMgYmVlbiBhbnkgYmlhcyBpbiBiZW5lZmljaWFyeSBzZWxlY3Rpb24gYW5kIHRhcmdldHRpbmcuIEl0IGlzIGltcGVyYXRpdmUgdG8gYmVnaW4gY29sbGVjdGluZyBkaXNhZ2dyZWdhdGVkIGJlbmVmaWNpYXJ5IGRhdGEgZnJvbSBwYXJ0bmVycy4NCg0KSXQgaXMgZW50aXJlbHkgcG9zc2libGUgdGhhdCBwYXJ0bmVycyBhcmUgY29sbGVjdGluZyB0aGlzIGRhdGEgLS0gZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBkYXRhIGlzIG9uZSBvZiB0aGUgbW9zdCBjb21tb24gZGF0YSByZXF1aXJlZCBmb3IgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcG9ydGluZyAtLSBhbmQgdGhhdCBpdCBpcyBtZXJlbHkgbmVjZXNzYXJ5IHRvIHdvcmsgd2l0aCBwYXJ0bmVycyB0byB3cmFuZ2xlIHRoZWlyIGRhdGEgaW50byB0aGUgNVcgZm9ybWF0LiBIb3dldmVyLCB0aGUgY2FwYWNpdGllcyBvZiBwYXJ0bmVycyB0byBkaXNhZ2dyZWdhdGUgYmVuZWZpY2lhcnkgZGF0YSBzaG91bGQgYmUgaW52ZXN0aWdhdGVkIGJ5IHRoZSBjbHVzdGVyIGFuZCBpcyBhbiBpbXBvcnRhbnQgaXNzdWUgdGhhdCBzaG91bGQgYmUgYnJvdWdodCB1cCBpbiB0ZSBuZXh0IHBsZW5hcnkgc2Vzc2lvbi4NCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBUeXBlcyBvZiBiZW5lZmljaWFyaWVzDQoNCmBgYHtyIGJlbmVmaWNpYXJ5LXR5cGUtZGF0YXNldH0NCmJlbl90eXBlIDwtIGZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieShiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgYWRvcm5fcGVyY2VudGFnZXMoZGVub21pbmF0b3IgPSAiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gcm91bmQoYmVuZWZpY2lhcmllcyAqIDEwMCwgZGlnaXRzID0gMikpDQpgYGANCg0KVGhlIHN0YXRlcyBhbmQgcmVnaW9ucyBpbiB3aGljaCB3ZSBhcmUgd29ya2luZyB0aGUgbW9zdCB3aXRoIElEUHMgYXJlIEJhZ28gKEVhc3QpLCBLYWNoaW4sIENoaW4sIFNoYW4gKE5vcnRoKSBhbmQgS2F5YWguIE92ZXJhbGwsIGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIG9mIGJlbmVmaWNpYXJpZXMgYXJlIGZyb20gdGhlIGhvc3QvbG9jYWwgY29tbXVuaXR5LCBgciBiZW5fdHlwZSAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIlJha2hpbmUgc3RhdGVsZXNzIikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcylgJSBhcmUgc3RhdGVsZXNzIHBlcnNvbnMgZnJvbSBSYWtoaW5lIGFuZCBgciBiZW5fdHlwZSAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkludGVybmFsbHkgRGlzcGxhY2VkIikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcylgJSBhcmUgSURQcy4gUmV0dXJuZWVzIGFyZSB0aGUgcmFyZXN0IHR5cGUgb2YgYmVuZWZpY2lhcnkgcmVhY2hlZCwgZm9ybWluZyBvbmx5IGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiUmV0dXJuZWVzIikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkLiBFYWNoIHJvdyBpbiB0aGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIHBlcmNlbnRhZ2Ugb2YgZWFjaCBiZW5lZmljaWFyeSB0eXBlIHdpdGhpbiBlYWNoIHN0YXRlL3JlZ2lvbi4NCg0KYGBge3IgdGFibGUtYmVuZWZpY2lhcnktdHlwZXMtc3RhdGV9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBiZW5lZmljaWFyeV90eXBlLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYWRvcm5fdG90YWxzKHdoZXJlID0gInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcyhkZW5vbWluYXRvciA9ICJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKGFjcm9zcygtc3RhdGUsIH4gcm91bmQoLiAqIDEwMCwgZGlnaXRzID0gMikpKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICAgICAgICAgICAgICBzdW1fYmVuKHN0YXRlKSwgYnkgPSAic3RhdGUiKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUGVyY2VudGFnZSBicmVha2Rvd24gb2YgYmVuZWZpY2lhcnkgdHlwZXMgYnkgc3RhdGUvcmVnaW9uIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSAic3RyaXBlZCIpDQoNCmBgYA0KDQo8YnI+DQoNCkNvbXBhcmVkIHRvIG9ubHkgdGhlIDIwMjEgSFJQIHRhcmdldHMgKGFzIHRoZSBJRVJQIGRvZXMgbm90IGhhdmUgYnJlYWtkb3ducyBvZiB0aGUgdGFyZ2V0IGJ5IGJlbmVmaWNpYXJ5IHR5cGUpLCB3ZSBjYW4gc2VlIHRoYXQgd2hpbHN0IHRhcmdldHMgaGF2ZSBiZWVuIG1vc3RseSBleGNlZWRlZCwgbmVpdGhlciB0aGUgdGFyZ2V0cyBmb3IgcmV0dXJuZWVzL3Jlc2V0dGxlZCBpbiBLYWNoaW4gb3IgU2hhbiAoTm9ydGgpIG5vciB0YXJnZXRzIGZvciBJRFBzIGluIFJha2hpbmUgb3IgS2F5aW4gaGF2ZSBiZWVuIG1ldC4gSW50ZXJlc3RpbmdseSwgZm9yIFJha2hpbmUsIHRoZSB0YXJnZXRzIGZvciB0aGUgaG9zdC9sb2NhbCBwb3B1bGF0aW9uIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkLCBwZXJoYXBzIGluZGljYXRpbmcgdGhhdCBvbmNlIHRhcmdldHMgd2VyZSBtZXQsIGFsbCBmdXJ0aGVyIGFsbG9jYXRpb25zIHdlcmUgdGFyZ2V0dGVkIGF0IHRoZSBob3N0L2xvY2FsIGNvbW11bml0aWVzLiBJbiBCYWdvIChFYXN0KSwgQ2hpbiwgS2F5aW4gYW5kIHBhcnRpY3VsYXJseSBTaGFuIChOb3J0aCksIHRoZSB0YXJnZXRzIGZvciBJRFBzIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkLCBpbiBjb21wYXJpc29uIHRvIHRoZSAyMDIxIEhSUCB0YXJnZXRzOg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyeS10eXBlLXJlYWNoZWQtaHJwLXRhcmdldH0NCiMgcmVtaW5kZXIgdG8gY2hlY2sgdGhlIHRleHQgaW4gdGhlIHBhcmFncmFwaCBhYm92ZSB3aGVuIHlvdSByZXJ1biB0aGUgcmVwb3J0IHdpdGggZGF0YQ0KcGluICU+JQ0KICBmaWx0ZXIoaHJwX3RhcmdldF90b3RhbCA+IDApICU+JSANCiAgc2VsZWN0KHN0YXRlLCBhZG1pbjNfcGNvZGUsIGhycF90YXJnZXRfaWRwc18yMDIxLCBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxLCBocnBfdGFyZ2V0X3N0YXRlbGVzc19yYWtoaW5lXzIwMjEsIA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEsIGhycF90YXJnZXRfdG90YWwpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUodG90YWxfYmVuZWZpY2lhcmllcyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhocnBfdGFyZ2V0X2lkcHNfMjAyMTp0b3RhbF9iZW5lZmljaWFyaWVzKSwgfnN1bSguKSkgJT4lIA0KICBtdXRhdGUoaG9zdF9sb2NhbF9wYyA9IGhvc3RfbG9jYWxfY29tbXVuaXR5IC8gaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEgKiAxMDAsIA0KICAgICAgICAgaWRwX3BjID0gaW50ZXJuYWxseV9kaXNwbGFjZWQgLyBocnBfdGFyZ2V0X2lkcHNfMjAyMSAqIDEwMCwNCiAgICAgICAgIHJldHVybmVlc19wYyA9IHJldHVybmVlcyAvIGhycF90YXJnZXRfcmV0dXJuZWVzXzIwMjEgKiAxMDAsDQogICAgICAgICByYWtoaW5lX3N0YXRlbGVzc19wYyA9IHJha2hpbmVfc3RhdGVsZXNzIC8gaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxICogMTAwLA0KICAgICAgICAgdG90YWxfcGMgPSB0b3RhbF9iZW5lZmljaWFyaWVzIC8gaHJwX3RhcmdldF90b3RhbCAqIDEwMCkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIGhvc3RfbG9jYWxfcGMsIGlkcF9wYywgcmV0dXJuZWVzX3BjLCByYWtoaW5lX3N0YXRlbGVzc19wYywgdG90YWxfcGMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhob3N0X2xvY2FsX3BjLCBpZHBfcGMsIHJldHVybmVlc19wYywgcmFraGluZV9zdGF0ZWxlc3NfcGMsIHRvdGFsX3BjKSwgfiByZXBsYWNlKC4sIGlzLm5hbiguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcmVwbGFjZSguLCBpcy5pbmZpbml0ZSguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcm91bmQoLiwgZGlnaXRzID0gMikpICU+JQ0KICByZW5hbWUoYGhvc3RfbG9jYWwlYCA9IGhvc3RfbG9jYWxfcGMsDQogICAgICAgICBgaWRwJWAgPSBpZHBfcGMsDQogICAgICAgICBgcmV0dXJuZWVzJWAgPSByZXR1cm5lZXNfcGMsDQogICAgICAgICBgcmFraGluZV9zdGF0ZWxlc3MlYCA9IHJha2hpbmVfc3RhdGVsZXNzX3BjLA0KICAgICAgICAgYHRvdGFsJWAgPSB0b3RhbF9wYykgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlBlcmNlbnRhZ2Ugb2YgMjAyMSBIUlAgdGFyZ2V0IHJlYWNoZWQgYnkgYmVuZWZpY2lhcnkgdHlwZSIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCiAgIyBwYW5kZXIoY2FwdGlvbiA9ICJQZXJjZW50YWdlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUiKQ0KDQogIA0KYGBgDQoNCjxicj4NCg0KU3RhdGVsZXNzIHBlcnNvbnMgZnJvbSBSYWtoaW5lIGhhdmUgdGhlIGxhcmdlc3QgYXZlcmFnZSBob3VzZWhvbGQgc2l6ZXMsIHdpdGggcmV0dXJuZWVzIGhhdmluZyB0aGUgbGFyZ2VzdCB2YXJpYXRpb25zIGluIGhvdXNlaG9sZCBzaXplLiBXaXRoIHJlZmVyZW5jZSB0byB0aGUgcGxvdCBiZWxvdywgdGhlIHRoaWNrIGJhciBpbiB0aGUgbWlkZGxlIG9mIGVhY2ggYm94IHNob3dzIHRoZSBhdmVyYWdlIGhvdXNlaG9sZCBzaXplIGZvciBlYWNoIGJlbmVmaWNpYXJ5IHR5cGUgLS0gdGhpcyB2YWx1ZSBpcyBhbHNvIHNob3duIGluIHRoZSB0ZXh0IGxhYmVsIGJlbG93IHRoZSBsaW5lLiBUaGUgbG93ZXIgYW5kIHVwcGVyIGJvcmRlcnMgb2YgZWFjaCBib3ggaW5kaWNhdGUgdGhlIHZhbHVlcyBmb3IgdGhlIDI1dGggYW5kIDc1dGggcGVyY2VudGlsZXMgcmVzcGVjdGl2ZWx5LiBGb3IgaW5zdGFuY2UsIHdlIGNhbiBzZWUgdGhhdCBob3VzZWhvbGRzIGF0IHRoZSAyNXRoIHBlcmNlbnRpbGUgb2YgaG91c2Vob2xkcyBpbiBob3N0L2xvY2FsIGNvbW11bml0aWVzIGhhdmUgb25seSBmb3VyIG1lbWJlcnMgYW5kIGhvdXNlaG9sZHMgdGhhdCBoYXZlIGFyb3VuZCA1IG1lbWJlcnMgaGF2ZSBtb3JlIG1lbWJlcnMgdGhhbiA3NSUgb2YgYWxsIHRoZSBob3VzZWhvbGRzIGluIHRoYXQgZ3JvdXAuIE91dGxpZXJzIGFyZSBtYXJrZWQgYnkgZG90cy4gV2Ugbm90ZSBhIGxvdCBvZiBwb3RlbnRpYWwgZGF0YSBlbnRyeSBlcnJvcnMgd2hlcmUgbGVzcyB0aGFuIG9uZSBwZXJzb24gcGVyIGhvdXNlaG9sZCB3YXMgcmVwb3J0ZWQuDQoNCjxicj4NCg0KYGBge3IgYm94cGxvdC1ob3VzZWhvbGQtc2l6ZS1iZW5lZmljaWFyeS10eXBlfQ0KDQojIHRoaXMgaXMgZm9yIHRoZSBsYWJlbHMgZm9yIHRoZSBib3hwbG90DQpoaGRfbGFicyA8LSBmc2MgJT4lICANCiAgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgIT0gIk5BIikgJT4lIA0KICBncm91cF9ieShiZW5lZmljaWFyeV90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoYXZnX2hoZF9zaXplID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIGhvdXNlaG9sZHMsIGRpZ2l0cyA9IDIpKSAgDQogDQoNCiMgZm9yIHNvbWUgcmVhc29uLCB0aGUgbXV0YXRlIGZjdF9yZW9yZGVyIGlzIG5vdCB3b3JraW5nDQojIHlvdSBmaWd1cmVkIHRoaXMgb3V0IGJ1dCBoYXZlIG5lZ2xlY3RlZCB0byB3cml0ZSB0aGUgYW5zd2VyIGhlcmUgDQogDQpmc2MgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSAhPSAiTkEiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgbXV0YXRlKGF2Z19oaGRfc2l6ZSA9IGJlbmVmaWNpYXJpZXMgLyBob3VzZWhvbGRzLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3Jlb3JkZXIoYmVuZWZpY2lhcnlfdHlwZSwgYXZnX2hoZF9zaXplKSwgeSA9IGF2Z19oaGRfc2l6ZSkpICsgDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBoaGRfbGFicywgYWVzKGxhYmVsID0gYXZnX2hoZF9zaXplKSwgc2l6ZSA9IDIuNSwgdmp1c3QgPSAtMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE0LCAyKSwgbGltaXRzID0gYygwLDE0KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJBdmVyYWdlIGhvdXNlaG9sZCBzaXplIiwNCiAgICAgICB0aXRsZSA9ICJBdmVyYWdlIGhvdXNlaG9sZCBzaXplIGJ5IGJlbmVmaWNpYXJ5IHR5cGVzIikNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA0LjMgTW9udGhseSBwcm9ncmVzcyBieSBiZW5lZmljaWFyeSB0eXBlDQoNCmBgYHtyIGJlbmVmaWNpYXJ5LXR5cGVzLXByb2dyZXNzLW92ZXItdGltZS1mYWNldH0NCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGZjdF9yZW9yZGVyKGJlbmVmaWNpYXJ5X3R5cGUsIGN1bV9iZW4sIG1heCwgLmRlc2MgPSBUUlVFKSkgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4pKSArDQogIGdlb21fbGluZShzaXplID0gMC43KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMS0wNy0wMSIpKSkgKw0KICBmYWNldF93cmFwKH4gYmVuZWZpY2lhcnlfdHlwZSwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgIyBzZWUgaWYgdGhpcyB3b3JrcyB3aGVuIHlvdSBrbml0LCB0aGVuIGRvIGl0IGZvciB0aGUgb3RoZXIgcGxvdHMgDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBiZW5lZmljaWFyeSB0eXBlLCAyMDIxIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KDQpgYGANCg0KPGJyPg0KDQpXaGlsc3QgdGhlIG51bWJlcnMgb2YgSURQcyBhbmQgUmV0dXJuZWVzIHJlYWNoZWQgZGlkIHNlZSBzaWduaWZpY2FudCBpbmNyZWFzZXMgYWZ0ZXIgSnVseSAyMDIxLCB3ZSBkbyBub3Qgb2JzZXJ2ZSBhbnkgZXZpZGVuY2UgdGhhdCB0aGlzIHdhcyB0aGUgcmVzdWx0IG9mIHRoZSBIUlAgYWRkZW5kdW0sIHJhdGhlciB0aGFuIHRoZSBjb250aW51YXRpb24gb2YgYWxyZWFkeSBleGlzdGluZyBwbGFucy4gSG93ZXZlciwgd2UgZG8gbm90ZSBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIHRoZSBudW1iZXJzIG9mIHBlcnNvbnMgaW4gdGhlIGhvc3QvbG9jYWwgY29tbXVuaXR5IHJlYWNoZWQgYWZ0ZXIgSnVseSAyMDIxIC0tIDc1JSBvZiBhbGwgaG9zdC9sb2NhbCBjb21tdW5pdHkgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYWZ0ZXIgdGhlIHB1YmxpY2F0aW9uIG9mIHRoZSBIUlAgYWRkZW5kdW0uIENvbnZlcnNlbHksIHRoZSBwcm9ncmVzcyBhbW9uZ3N0IHN0YXRlIFJha2hpbmUgcGVyc29ucyBzbG93ZWQgc3Vic3RhbnRpYWxseSBhZnRlciB0aGUgcHVibGljYXRpb24gb2YgdGhlIGFkZGVuZHVtOyBhcyB3ZSBoYXZlIG1lbnRpb25lZCBlYXJsaWVyLCBvbmNlIHRhcmdldHMgd2VyZSByZWFjaGVkIGZvciBzdGF0ZWxlc3MgcGVyc29ucywgYWRkaXRpb25hbCBhbGxvY2F0aW9ucyB3ZXJlIGRpcmVjdGVkIGF0IHRoZSBob3N0L2xvY2FsIGNvbW11bml0eSAtLSB3aGV0aGVyIHRoaXMgd2FzIGR1ZSB0byBhY2Nlc3MgaXNzdWVzIG9yIHRoYXQgdGhlIGhvc3QvbG9jYWwgY29tbXVuaXR5IGluIFJha2hpbmUgd2VyZSBldmFsdWF0ZWQgdG8gYmUgYXMgZm9vZCBpbnNlY3VyZSBhcyB0aGUgc3RhdGVsZXNzIHBvcHVsYXRpb24gcmVtYWlucyB0byBiZSBpbnZlc3RpZ2F0ZWQuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KYmVuICU+JSANCiAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSkgJT4lIA0KICBtdXRhdGUoYWZ0ZXJfaHJwID0gaWZlbHNlKGRhdGUgPiAiMjAyMS0wNi0wMSIsICJhZnRlcl9hZGRlbmR1bSIsICJiZWZvcmVfYWRkZW5kdW0iKSkgJT4lIA0KICBzdW1fYmVuMihhZnRlcl9ocnAsIGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFmdGVyX2hycCwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3RvdGFscygiY29sIikgJT4lIA0KICBtdXRhdGUoYCViZWZvcmVgID0gcm91bmQoYmVmb3JlX2FkZGVuZHVtIC8gVG90YWwgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgYCVhZnRlcmAgPSByb3VuZChhZnRlcl9hZGRlbmR1bSAvIFRvdGFsICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICByZWxvY2F0ZShiZWZvcmVfYWRkZW5kdW0sIC5hZnRlciA9IGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJSZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUsIGJlZm9yZSBhbmQgYWZ0ZXIgSFJQIGFkZGVuZHVtIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA0LjMgR2FwcyBpbiBtb250aGx5IHByb2dyYW1taW5nDQoNCmBgYHtyIHRhYmxlLWdhcHMtbW9udGhzfQ0KIyBJIGZlZWwgbGlrZSB0aGlzIGlzIHRoZSBtb3N0IGluZWZmaWNpZW50IHdheSB0byBkbyB0aGlzOyBzdGlsbCB3b3JrcywgdGhvdWdoIA0KIyB5b3UncmUgZ29pbmcgdG8gbmVlZCB0byByZXdyaXRlIHRoaXMgd2hlbiB5b3UgaGF2ZSBRNCBkYXRhIA0KZ2FwX21vbnRocyA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoZnJlcXVlbmN5ID09ICJNb250aGx5IiAmIGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGltcGxlbWVudGluZ19wYXJ0bmVycywgYWN0aXZpdHksIHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRhdGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICB1bm5lc3QoKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShyZWN1cnJlbmNlcyA9IHJvd1N1bXMoIWlzLm5hKHNlbGVjdCguLCAtaW1wbGVtZW50aW5nX3BhcnRuZXJzLCAtYWN0aXZpdHksIC1zdGF0ZSwgLXRvd25zaGlwLCAtbG9jYXRpb24pKSksDQogICAgICAgICBiZW5fbWF4ID0gcG1heChgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCwgYDIwMjEtMTAtMDFgLCBgMjAyMS0xMS0wMWAsIGAyMDIxLTEyLTAxYCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCwgYDIwMjEtMTAtMDFgLCBgMjAyMS0xMS0wMWAsIGAyMDIxLTEyLTAxYCksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiZGF0ZSIsIHZhbHVlc190byA9ICJiZW5lZmljaWFyaWVzIikgJT4lIA0KICBtdXRhdGUoZGlzdHJpYnV0aW9uID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAibiIsICJ5IikpICU+JSANCiAgc2VsZWN0KC1iZW5lZmljaWFyaWVzKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkYXRlLCB2YWx1ZXNfZnJvbSA9IGRpc3RyaWJ1dGlvbikgJT4lIA0KICBtdXRhdGUoZ2FwcyA9IHBhc3RlMChgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCwgYDIwMjEtMTAtMDFgLCBgMjAyMS0xMS0wMWAsIGAyMDIxLTEyLTAxYCkpICU+JSANCiAgbXV0YXRlKGdhcF9tb250aHMgPSBjYXNlX3doZW4oc3RyX2RldGVjdChnYXBzLCAieW5ubm5ubm5ubm5ueSIpIH4gMTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm5ubm5ueSIpIH4gMTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm5ubm55IikgfiA5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm5ubm55IikgfiA4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm5ubnkiKSB+IDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm55IikgfiA2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm55IikgfiA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubnkiKSB+IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm55IikgfiAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm55IikgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bnkiKSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgDQoNCiMjIGNvbW1lbnRlZCBvdXQsIGJ1dCB0aGlzIHdhcyBqdXN0IHRvIGdldCB0aGUgbnVtYmVyIG9mIHRvd25zaGlwcyB3aXRoIGdhcHMgcGVyIHN0YXRlDQojIGdhcF9tb250aHMgJT4lIA0KIyAgIGZpbHRlcihyZWN1cnJlbmNlcyA+IDEpICU+JSANCiMgICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiMgICBzdW1tYXJpc2UoYXZnX2dhcCA9IG1lYW4oZ2FwX21vbnRocyksIA0KIyAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbl9tYXgpKSAlPiUgDQojICAgYXJyYW5nZShkZXNjKGF2Z19nYXApKSAlPiUNCiMgICBmaWx0ZXIoYXZnX2dhcCA+IDApICU+JSANCiMgICBncm91cF9ieShzdGF0ZSkgJT4lDQojICAgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QodG93bnNoaXApKQ0KDQpnYXBfbW9udGhzICU+JSANCiAgZmlsdGVyKHJlY3VycmVuY2VzID4gMSkgJT4lIA0KICBncm91cF9ieShnYXBfbW9udGhzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QodG93bnNoaXApLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIGFuZCBsb2NhdGlvbnMgYnkgZHVyYXRpb24gb2YgZ2FwcyBpbiBpbXBsZW1lbnRhdGlvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCiAgIyBwYW5kZXIoY2FwdGlvbiA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyBhbmQgbG9jYXRpb25zIGJ5IGR1cmF0aW9uIG9mIGdhcHMgaW4gaW1wbGVtZW50YXRpb24iKQ0KDQojIHJlbWluZGVyIHRvIGNoZWNrIHRoZSBwYXJhZ3JhcGggYmVsb3cgd2hlbiB5b3UgcmVydW4gdGhlIHJlcG9ydA0KDQpgYGANCiANCiA8YnI+DQogDQpgciByb3VuZChmaWx0ZXIoZ2FwX21vbnRocywgcmVjdXJyZW5jZXMgPiAxICYgZ2FwX21vbnRocyA+IDAgKSAlPiUge3N1bSguJGJlbl9tYXgpfSAvIGZpbHRlcihnYXBfbW9udGhzLCByZWN1cnJlbmNlcyA+IDEpICU+JSB7c3VtKC4kYmVuX21heCl9ICogMTAwKWAlIG9mIGJlbmVmaWNpYXJpZXMgZXhwZXJpZW5jZWQgZ2FwcyBvciBkZWxheXMgaW4gbW9udGhseSBwcm9ncmFtbWluZywgd2l0aCB0aGUgbW9zdCBjb21tb24gZGVsYXkgYmVpbmcgMyBtb250aHMuIFRoZSA4LW1vbnRoIGRlbGF5IHdhcyB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgZm9vZCBiYXNrZXRzIGluIEJ1dGhpZGF1bmcsIHdoZXJlIGRpc3RyaWJ1dGlvbnMgb25seSBvY2N1cnJlZCBpbiBGZWJydWFyeSBhbmQgTm92ZW1iZXIgMjAyMS4gVGhlIDUtbW9udGggZGVsYXlzIHdlcmUgYWxsIGZyb20gbG9jYXRpb25zIGluIFJha2hpbmUgYW5kIEthY2hpbi4gT3ZlcmFsbCwgZ2FwcyBpbiBtb250aGx5IHByb2dyYW1taW5nIHdlcmUgZXhwZXJpZW5jZWQgaW4gMzkgdG93bnNoaXBzLCB3aXRoIHRoZSBtYWpvcml0eSBvcmdpbmF0aW5nIGZyb20gS2FjaGluLCBBeWV5YXJ3YWR5IGFuZCBSYWtoaW5lLg0KDQpUaGVyZSBhcmUgYHIgZmlsdGVyKGdhcF9tb250aHMsIHJlY3VycmVuY2VzID09IDEpICU+JSBucm93KClgIGVudHJpZXMgY29kZWQgYXMgYmVpbmcgaW1wbGVtZW50ZWQgb24gYSBtb250aGx5IGJhc2lzIHRoYXQgaGF2ZSBub3QgcmVjdXJyZWQgLS0gdGhhdCBpcywgdGhleSBoYXZlIG9ubHkgYmVlbiBpbXBsZW1lbnRlZCBvbmNlOiB3ZSBzaG91bGQgY2hlY2sgd2l0aCBwYXJ0bmVycyBpZiB0aGVzZSBhcmUgbWVyZWx5IHRoZSBmaXJzdCBpbnN0YW5jZXMsIG9yIGlmIHRoZXJlIGhhdmUgYmVlbiBpc3N1ZXMgd2l0aCBhY2Nlc3MsIHNlY3VyaXR5IG9yIGZ1bmRpbmcgb3IgaWYgdGhleSBhcmUgZXJyb3JzIGluIGRhdGEgZW50cnkgLg0KDQo8YnI+PGJyPg0KDQojIyMgNC40IFBvdGVudGlhbCBmb3IgcG9zdC1kaXN0cmlidXRpb24gbW9uaXRvcmluZw0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgYWN0aXZpdGllcyB3aGljaCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgZm9yIDYgbW9udGhzIG9yIG1vcmUsIHRoZSBudW1iZXIgb2YgbG9jYXRpb25zIHRoZXkgd2VyZSBpbXBsZW1lbnRlZCBpbiBhbmQgdGhlIG51bWJlciBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGFjdGl2aXRpZXMgbWVldGluZyB0aGVzZSBjcml0ZXJpYS4gVGhlIHBvc3NpYmlsaXR5IG9mIGpvaW50IG1vbml0b3JpbmcgLS0gb3IgYXQgbGVhc3QgdGhlIGpvaW50IHJldmlldyBhbmQgYW5hbHlzaXMgb2YgbW9uaXRvcmluZyBkYXRhIC0tIHdpbGwgYmUgZXhwbG9yZWQsIGluIGNvbnN1bHRhdGlvbiB3aXRoIHRoZXNlIHBhcnRuZXJzLiBUaGUgcmF0aW9uYWxlIGJlaW5nIHRoYXQgNiBtb250aHMgb2YgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGEgbG9uZyBlbm91Z2ggcGVyaW9kIG9mIHRpbWUgdG8gbWFrZSBpbXBhY3QgbW9uaXRvcmluZyBmZWFzaWJsZTsgYWRkaXRpb25hbGx5LCBqb2ludCBtb25pdG9yaW5nIHdpbGwgYmUgZnVydGhlciBmYWNpbGl0YXRlZCBieSB0aGUgc2ltaWxhcml0eSBvZiB0aGVzZSBhY3Rpdml0aWVzLCBhbG1vc3QgYWxsIG9mIHdoaWNoIGFyZSByZWN1cnJlbnQgY2FzaCB0cmFuc2ZlcnMgb3IgZGlzdHJpYnV0aW9ucyBvZiBmb29kIGJhc2tldHMuDQoNCmBgYHtyIHRhYmxlLW1vbnRobHktYWN0aXZpdGllcy02LTktbW9udGhzLCB3YXJuaW5nPUZBTFNFfQ0KDQpnYXBfbW9udGhzICU+JSAgDQogIGZpbHRlcihyZWN1cnJlbmNlcyA+IDUpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gbigpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcywgYnkgYWN0aXZpdHksIHdobyBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IDYgbW9udGhzIG9mIHJlY3VycmVudCBmb29kIHNlY3VyaXR5IHN1cHBvcnQiLA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpDQogICMgcGFuZGVyKGNhcHRpb24gPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMsIGJ5IGFjdGl2aXR5LCB3aG8gaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCA2IG1vbnRocyBvZiByZWN1cnJlbnQgZm9vZCBzZWN1cml0eSBzdXBwb3J0IikNCg0KYGBgDQoNCjxicj4NCg0KVGhlc2UgYXJlIHRoZSBwYXJ0bmVycyB3aG8gaGF2ZSBpbXBsZW1lbnRlZCBtb250aGx5IGZvb2QgYmFza2V0cyBhbmQgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyBmb3IgbW9yZSB0aGFuIDYgbW9udGhzOg0KDQpgYGB7ciB0YWJsZS1wYXJ0bmVycy02LW1vbnRoc30NCmdhcF9tb250aHMgJT4lICANCiAgZmlsdGVyKHJlY3VycmVuY2VzID4gNSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbl9tYXgpKSAlPiUgIA0KICBmaWx0ZXIoYWN0aXZpdHkgPT0gIlByb3ZpZGUgbW9udGhseSBmb29kIGJhc2tldHMiIHwgYWN0aXZpdHkgPT0gIlByb3ZpZGUgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyIpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFjdGl2aXR5LCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJQYXJ0bmVycyB3aG8gaGF2ZSBpbXBsZW1lbnRlZCBjYXNoIHRyYW5zZmVycyBhbmQgZm9vZCBiYXNrZXRzIGZvciBhdCBsZWFzdCA2IG1vbnRocyIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuIE5leHQgc3RlcHMNCg0KMS4gIENvbW11bmljYXRlIHRvIHBhcnRuZXJzIHRoYXQgWWFuZ29uIGlzIHNldmVyZWx5IG92ZXJzdWJzY3JpYmVkIGluIGNvbXBhcmlzb24gdG8gdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnksIGFib3ZlIGFsbCBpbiB0aGUgdG93bnNoaXBzIG9mIEhsYWluZ3RoYXJ5YSwgU2h3ZXB5aXRoYXIsIERhZ29uIE15b3RoaXQgKFNlaWtrYW4pLCBEYWxhIGFuZCBOb3J0aCBPa2thbGFwYS4NCg0KMi4gIENvbGxlY3QgZXhpc3RpbmcgaW50ZXJ2ZW50aW9uIHBhY2thZ2VzIGZyb20gcGFydG5lcnMgaW4gb3JkZXIgdG8gYmVnaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhbmRhcmRpc2F0aW9uIGFuZCB0byBzdXBwb3J0IHRoZSByZXZpZXcgb2YgZm9vZCBiYXNrZXRzIGZvciB0aGVpciBjYWxvcmljIGFuZCBudXRyaXRpb25hbCB2YWx1ZS4gUGVyZm9ybSBhZGRpdGlvbmFsIGFuYWx5c2lzIHRvIHVuZGVyc3RhbmQgaWYgYmVuZWZpY2lhcmllcyBpbiBjbG9zZSBwcm94aW1pdHkgdG8gZWFjaCBvdGhlciBoYXZlIHJlY2VpdmVkIHdpZGVseSBkaXZlcmdlbnQgcGFja2FnZSB2YWx1ZXMuIEFkZGl0aW9uYWxseSwgc3BlYWsgd2l0aCBwYXJ0bmVycyB0byB1bmRlcnN0YW5kIHdoeSBjYXNoIHRyYW5zZmVyIHZhbHVlcyB2YXJ5IGV2ZW4gd2l0aGluIHRoZSBzYW1lIGFjdGl2aXR5IGltcGxlbWVudGVkIGJ5IHRoZSBzYW1lIHBhcnRuZXIuDQoNCjMuICBSZXZpc2l0IGFyZWFzIHdoaWNoIGhhdmUgb25seSByZWNlaXZlZCBzbWFsbGVyIHN1cHBsZW1lbnRhcnkgdHJhbnNmZXJzIC0tIGEgdHJhbnNmZXIgb2YgYXJvdW5kIFVTRCAxMCBwZXIgaG91c2Vob2xkIHBlciBtb250aCBjYW5ub3QgYmUgY29uc2lkZXJlZCB0byBoYXZlIGNvdmVyZWQgdGhlIGZvb2Qgc2VjdXJpdHkgbmVlZHMgZm9yIHRoYXQgYXJlYSAtLSBvdGhlciBwYXJ0bmVycyBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNvdmVyIHRoZSBnYXAuDQoNCjQuICBBZHZvY2F0ZSBmb3IgdGhlIGV4cGFuc2lvbiBvZiBwYXJ0bmVycycgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIHRvIHJlYWNoIHRoZSByZW1haW5pbmcgMTc5IHRvd25zaGlwcyB3aGljaCBoYXZlIHlldCB0byBiZW5lZml0IGZyb20gYW55IEZTQyBhY3Rpdml0aWVzLiBUaGUgZWZmZWN0cyBvZiB0aGUgY3VycmVudCBjcmlzaXMgaW4gTXlhbm1hciBoYXZlIG5vdCBiZWVuIGRldGVybWluZWQgYnkgYW4gZXBpY2VudHJlIG9yIGEgc3Rvcm1wYXRoIGFuZCB0aGVyZSBpcyBubyBwcm9ncmFtbWF0aWMgcmF0aW9uYWxlIGZvciB0aGUgcmVzcG9uc2UgdG8gYmUgc28gdW5ldmVuLiBUaGlzIGFkdm9jYWN5IHNob3VsZCBiZSB0YXJnZXR0ZWQgYXQgdGhlIElDQ0csIENsdXN0ZXIgcGFydG5lcnMgYW5kIGF0IGRvbm9ycy4NCg0KNS4gIENvbGxlY3QgNVcgZGF0YSBmcm9tIG90aGVyIGNsdXN0ZXJzIHNvIHRoYXQgbXVsdGktc2VjdG9yIGNvdmVyYWdlIG1heSBiZSByZXZpZXdlZC4gQ2xlYW4gYW5kIHByb2Nlc3MgY29uZmxpY3QgZGF0YSBzbyB0aGF0IGl0IG1heSBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggcGFydG5lcnMnIGNvdmVyYWdlLiBTaGFyZSByYXcgZGF0YSB3aXRoIG90aGVyIENsdXN0ZXJzIHRvIGltcHJvdmUgY29vcmRpbmF0aW9uLg0KDQo2LiAgV29yayB3aXRoIHBhcnRuZXJzIHRvIGRldGVybWluZSB0aGVpciBjdXJyZW50IGNhcGFjaXRpZXMgdG8gc3VibWl0IGFnZSBhbmQgc2V4LWRpc2FnZ3JlZ2F0ZWQgYmVuZWZpY2lhcnkgZGF0YS4gRGV2ZWxvcCBhIHdvcmtwbGFuIHRvIGVuc3VyZSB0aGF0IHRoZXkgY2FuIG1lZXQgcmVwb3J0aW5nIHJlcXVpcmVtZW50cy4NCg0KNy4gIFNvbGljaXQgbW9uaXRvcmluZyByZXBvcnRzIGZyb20gcGFydG5lcnMgYW5kIGV4cGxvcmUgdGhlIHBvc3NpYmlsaXR5IG9mIGpvaW50IG1vbml0b3JpbmcuDQoNCjguICBSZXZpc2UgdGhlIDVXIHRlbXBsYXRlIC0tIGluIGNvbnN1bHRhdGlvbiB3aXRoIHBhcnRuZXJzIC0tIGluIG9yZGVyIHRvIGFkZHJlc3MgdGhlIGRhdGEgY29sbGVjdGlvbiBpc3N1ZXMgaWRlbnRpZmllZC4NCg0KPGJyPjxicj48YnI+DQoNCiMjIDYuIFJlZmVyZW5jZSB0YWJsZSAtLSB0b3duc2hpcHMNCg0KVGhlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdyBtYXkgYmUgc29ydGVkIGFuZCBmaWx0ZXJlZCBieSBhbnkgb2YgdGhlIGNvbHVtbnMuIA0KDQpgYGB7ciBkYXRhdGFibGUtdG93bnNoaXBzLXJlZmVyZW5jZX0NCiMgYWRkIGluIHRhcmdldA0KcGluICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgYWRtaW4zX3Bjb2RlLCB0b3RhbF9wb3AsIFBJTl8yMDIyID0gcGluXzIwMjIsIElEUHMgPSBpZHBzKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9wb3AgPSByb3VuZCh0b3RhbF9wb3AsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhY3Rpdml0eSwgcGFydG5lcnMgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGJlbmVmaWNpYXJpZXMgPSB1X2JlbiwgYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChwYXJ0bmVycyksDQogICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMgPSBzdW0oYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbikpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmVwbGFjZV9uYShsaXN0KHBhcnRuZXJzID0gMCwgYmVuZWZpY2lhcmllcyA9IDAsIGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzID0gMCwgbG9jYXRpb25zID0gMCkpICU+JSANCiAgcmVsb2NhdGUoYWRtaW4zX3Bjb2RlLCAuYWZ0ZXIgPSBsb2NhdGlvbnMpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSAidG9wIiwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICAgImZ1bmN0aW9uKHNldHRpbmdzLCBqc29uKSB7IiwNCiAgICAgICAgICBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgICAgICAgICAifSIpDQogICAgICAgKSANCiAgICAgKSANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNy4gSW50ZXJhY3RpdmUgbWFwcyAtLSAyMDIyIFBJTiBhbmQgMjAyMSBiZW5lZmljaWFyaWVzIHJlYWNoZWQNCg0KPGJyPg0KDQojIyMgNy4xIE1hcCBvZiAyMDIyIFBJTiBieSB0b3duc2hpcA0KDQpgYGB7ciByZWZlcmVuY2UtbWFwLWdncGxvdGx5LCBmaWcuaGVpZ2h0PTEwfQ0KDQojIEkgdGhpbmsgeW91IG5lZWQgdG8gY29hbGVzY2UgdGhlIHN0YXRlcyBhbmQgdG93bnNoaXBzIHdpdGggcGNvZGUzX3NoYXBlIG9yIHN0YXJ0IHdpdGggcGNvZGUzX3NoYXBlDQp0c3BfbWFwIDwtIHBjb2RlM19zaGFwZSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNfcGNvZGUsIHRvdGFsX3BvcCwgaWRwcywgcGluXzIwMjIpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSANCiAgbXV0YXRlKHRvdGFsX3BvcCA9IHJvdW5kKHRvdGFsX3BvcCkpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IDAuMSwNCiAgICAgICAgICBhZXMoZmlsbCA9IHBpbl8yMDIyLA0KICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBJTiAyMDIyOiAiLCBwaW5fMjAyMiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgcG9wOiAiLCB0b3RhbF9wb3AsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEUHM6ICIsIGlkcHMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZyBjb3VudDogIiwgcGFydG5lcnMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGJlbmVmaWNpYXJpZXMpKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArIA0KICBsYWJzKGZpbGwgPSAiUElOIDIwMjIiLA0KICAgICAgIHRpdGxlID0gIk1hcCBvZiB0b3duc2hpcHMgYnkgMjAyMiBQSU4iKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgDQoNCmdncGxvdGx5KHRzcF9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JQ0KICBsYXlvdXQoc2hvd2xlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBwbG90bHk6OnN0eWxlKGhvdmVyb24gPSAiZmlsbCIpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJNYXAgb2YgdG93bnNoaXBzIGJ5IDIwMjIgUElOIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlsczsgY2xpY2sgYW5kIGRyYWcgdG8gc2VsZWN0IGFuZCB6b29tIiwiPC9zdXA+IikpKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA3LjIgTWFwIG9mIDIwMjEgYmVuZWZpY2lhcmllcyBieSB0b3duc2hpcA0KDQpgYGB7ciBiZW5lZmljaWFyaWVzLW1hcC1nZ3Bsb3RseSwgZmlnLmhlaWdodD0xMH0NCg0KIyBJIHRoaW5rIHlvdSBuZWVkIHRvIGNvYWxlc2NlIHRoZSBzdGF0ZXMgYW5kIHRvd25zaGlwcyB3aXRoIHBjb2RlM19zaGFwZSBvciBzdGFydCB3aXRoIHBjb2RlM19zaGFwZQ0KdHNwX21hcF9iZW4gPC0gcGNvZGUzX3NoYXBlICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNfcGNvZGUsIHBpbl8yMDIyKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gMC4xLA0KICAgICAgICAgIGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBiZW5lZmljaWFyaWVzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcgY291bnQ6ICIsIHBhcnRuZXJzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3QgY291bnQ6ICIsIGFjdGl2aXRpZXMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBJTiAyMDIyOiAiLCBwaW5fMjAyMikpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgdHJhbnMgPSAibG9nMTAiLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgbGFicyhmaWxsID0gImJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHRpdGxlID0gIk1hcCBvZiB0b3duc2hpcHMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjEiKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgDQoNCmdncGxvdGx5KHRzcF9tYXBfYmVuLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUNCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSBsaXN0KGZvbnQgPSBsaXN0KHNpemUgPSA2KSkpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gImZpbGwiKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiTWFwIG9mIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IGNsaWNrIGFuZCBkcmFnIHRvIHNlbGVjdCBhbmQgem9vbSIsIjwvc3VwPiIpKSkNCmBgYA0K